From 47d90e545652973594b7dce9b5f66b2d6d0baa8e Mon Sep 17 00:00:00 2001 From: MoonOld Date: Sat, 22 Jul 2023 00:28:32 +0800 Subject: [PATCH] [fix tech] indentation --- content/posts/tech/PostgreSql_TX_Concurrent.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/content/posts/tech/PostgreSql_TX_Concurrent.md b/content/posts/tech/PostgreSql_TX_Concurrent.md index fd2d58c..815f2f4 100644 --- a/content/posts/tech/PostgreSql_TX_Concurrent.md +++ b/content/posts/tech/PostgreSql_TX_Concurrent.md @@ -138,10 +138,14 @@ SELECT pg_advisory_lock(id) FROM foo WHERE id = 12345; -- ok ``` 请注意咨询锁对于排序、LIMIT操作并没有定义的happens-before关系,即可能虽然LIMIT返回10条数据,但是可能对LIMIT前的结果全部获取了咨询锁。 ## MVCC —— Multiversion Concurrentcy Control 多版本并发控制 -对于PG来说,最主要的隔离手段就是通过MVCC和锁的方法.PG最重要的一点是,单纯的SELECT永远不会被修改表的语句阻塞,即使在最高的隔离级别里。 -PG中MVCC的实现里,每一个事务或操作中都被标记一个XID。每当一个这样的主体开始操作,PG通过自增的方式返回一个XID赋值其上。而每一行数据都有自己的版本,而这个版本源于每一个操作这一行数据的主体XID。 -例如,当XID为x的操作执行一个Insert并成功提交时,PG会在行中插入额外的版本信息——xmin= x。在今后所有的读取操作中,***所有小于当前XID的行会被当前操作所读取***。也就是说,只有当写入的事务完成后,其修改的行内容只会在其之后开始的事务可见。 -DELETE和UPDATE会插入xmax值,当xmax值大于当前事务ID,说明该数据已经被修改/删除了,当xmax小于当前事务id时,则说明该行是有效的。 +对于PG来说,最主要的隔离手段就是通过MVCC和锁的方法.PG最重要的一点是,单纯的SELECT永远不会被修改表的语句阻塞,即使在最高的隔离级别里。 + +PG中MVCC的实现里,每一个事务或操作中都被标记一个XID。每当一个这样的主体开始操作,PG通过自增的方式返回一个XID赋值其上。而每一行数据都有自己的版本,而这个版本源于每一个操作这一行数据的主体XID。 + +例如,当XID为x的操作执行一个Insert并成功提交时,PG会在行中插入额外的版本信息——xmin= x。在今后所有的读取操作中,***所有小于当前XID的行会被当前操作所读取***。也就是说,只有当写入的事务完成后,其修改的行内容只会在其之后开始的事务可见。 + +DELETE和UPDATE会插入xmax值,当xmax值大于当前事务ID,说明该数据已经被修改/删除了,当xmax小于当前事务id时,则说明该行是有效的。 + 从抽象的角度来看,MVCC通过版本的额外信息存储来换取并发的性能减少阻塞带来的性能损失。 ## 事务隔离 —— Transaction Isolation 数据库并发读写主要问题有以下四点