暂无图片
pg中行锁的实现方式是哪种?oracle是在数据块上,mysql是索引上
我来答
分享
暂无图片 匿名用户
pg中行锁的实现方式是哪种?oracle是在数据块上,mysql是索引上

pg中行锁的实现方式是哪种?oracle是在数据块上,mysql是索引上

比如表t  create table t(id int ,b int) ,没有任何索引


insert into  t values(100,1)  ,(200,2),(300,3)


select * from  t  where b=2 for update ;  ---sess 1

select * from  t  where b=3 for update ;  ---sess 2

mysql中由于b字段没有索引,无论是rr 还是rc 隔离,都会出现锁等待,

oracle下,不会出现锁等待;

请问pg是哪种情况?行锁是通过哪种方式实现的



我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
清风生

pg中,这两个会话不会阻塞。

在pg中,行锁信息保存在数据块中,通常只在tuple的头部中设置标识位来标识记录此行已被锁,标识位为xmax和infomask,xmax放置当前事务的xid,infomask放置标记位。

行锁通过在当前事务号(locktype='transactionid')上加ExclusiveLock锁实现,如果出现行锁阻塞的情况,在pg_locks中体现为transactionid类型被阻塞,pg_locks中还会有tuple锁(locktype='tuple',如果是唯一索引插入冲突则不会有)信息,描述被阻塞的行锁信息。

暂无图片 评论
暂无图片 有用 3
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏