Skip to content

Commit

Permalink
[fix tech] indentation
Browse files Browse the repository at this point in the history
  • Loading branch information
MoonOld committed Jul 21, 2023
1 parent ec9955e commit 47d90e5
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions content/posts/tech/PostgreSql_TX_Concurrent.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
数据库并发读写主要问题有以下四点
Expand Down

0 comments on commit 47d90e5

Please sign in to comment.