基于多个旧值版本的并发控制即MVCC,就是实现一致读
PostgreSQL为每一个事务分配一个递增的、类型为int32的整数作为唯一的事务ID,即xid。
创建一个新的快照时,将收集当前正在执行的事务id和已提交的最大事务id。
根据快照提供的信息,PostgreSQL可以确定事务的操作是否对执行语句是可见的。
PostgreSQL还在系统里的每一行记录上都存储了事务相关的信息,同样用来判断一行记录对于当前事务是否可见。
在PostgreSQL的内部数据结构中,每个元组(行记录)有4个事务可见性相关的隐藏列:xmin , xmax, cmin, cmax
其中cmin和cmax分别是插入和删除该元组的命令在事务对其他事务的可见性相关;xmin保存了创建该行数据的事务的xid,xmax保存的是删除改行的xid。
sarah=# create table tbl_mvcc(id serial primary key, ival int); CREATE TABLE sarah=# insert into tbl_mvcc(ival) values(1); INSERT 0 1 sarah=# select xmin, xmax, cmin, cmax, id, ival from tbl_mvcc where id=1; xmin | xmax | cmin | cmax | id | ival ------+------+------+------+----+------ 599 | 0 | 0 | 0 | 1 | 1 (1 row)
当插入一行数据时,PostgreSQL会将插入这行数据的事务的xid存储在xmin中。
由回滚的事务或未提交的事务创建的行对于任何其他事务都是不可见的;
sarah=# begin; BEGIN sarah=# select txid_current(); txid_current -------------- 622 (1 row) sarah=# insert into tbl_mvcc(id, ival) values(6,6); INSERT 0 1 sarah=# select xmin, xmax, cmin, cmax, id, ival from tbl_mvcc where id=6; xmin | xmax | cmin | cmax | id | ival ------+------+------+------+----+------ 622 | 0 | 0 | 0 | 6 | 6 (1 row)
开启另一个会话:
postgres=# select txid_current(); txid_current -------------- 623 (1 row) sarah=# select * from tbl_mvcc where id=6; id | ival ----+------ (0 rows)
未提交就看不见;
通过xmax值判断事务的更新操作和删除操作:
免责声明:本站发布的内容(图片、视频和文字)以原创、来自互联网转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:ts@56dr.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
Copyright © 2009-2021 56dr.com. All Rights Reserved. 特网科技 版权所有 珠海市特网科技有限公司 粤ICP备16109289号
域名注册服务机构:阿里云计算有限公司(万网) 域名服务机构:烟台帝思普网络科技有限公司(DNSPod) CDN服务:阿里云计算有限公司 中国互联网举报中心 增值电信业务经营许可证B2