暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 原理:事务快照 和 隔离级别

原创 liaju 2020-11-02
2327

快照是一个很形象的词,就像拍下一张照片,记录下此刻的信息。 观察者通过快照只能获取当前时间点之前的信息,而按下快门以后的信息便无法察觉,即不可见。

类比于快照,事务快照就是存储着某个特定事务在某个特定时间段所看到的事务状态信息的数据集。事务状态归纳为2种:

  • 活跃事务(active txid):正在进行中或尚未开始的事务,其修改结果不可见
  • 不活跃事务(inactive txid):已提交或回滚的事务,若已提交则修改结果可见

通过txid_current_snapshot函数可以看到当前事务的快照信息。

testdb=# SELECT txid_current_snapshot();
 txid_current_snapshot 
-----------------------
 100:104:100,102
(1 row)

快照由这样一个序列构成:xmin:xmax:xip_list ,注意不要与元组的t_xmin和t_xmax弄混

  • xmin:最早的状态仍为active的事务txid,所有比它更早的事务(txid<xmin),要么已提交并可见,要么已回滚并生成死元组。
  • xmax:获取快照时第一个尚未分配的xid,所有txid>=xmax的事务在获取快照时尚未启动,因此其结果对当前事务不可见。
  • xip_list:获取快照时,所有active事务的txid列表,该列表仅包含[xmin,xmax)范围内的活跃事务txid

image.png

'100:100:'含义如下

xmin=100,所以txid<100的事务均不活跃
xmax=100,所以txid>=100的事务均活跃
xip_list为空,表示[xmin,xmax)范围内无活跃事务
本事务txid=99,且已提交或已回滚

'100:104:100,102'含义如下

xmin=100,所以txid<100的事务均不活跃
xmax=104,所以txid>=104的事务均活跃
xip_list为100,102,表示[xmin,xmax)范围内100,102为活跃事务
本事务txid=103,且已提交或已回滚

pg会根据不同隔离级别设置,获取不同时刻的快照:

  • 已提交读:在该事务的每条sql执行之前都会重新获取一次snapshot
  • 可重复读和可串行化:该事务只在第一条sql执行之前获取一次snapshot

image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论