MVCC数据库在交易中是否看到插入的行?

MVCC数据库在交易中是否看到插入的行?,第1张

MVCC数据库在交易中是否看到插入的行?

答案确实取决于服务器的实现以及唯一约束是否标记为可延迟

我没有针对其他数据库进行过测试,但是在PostgreSQL(作为最著名的开源MVCC数据库之一)中,在我的测试中,复制设置T2失败

INSERT
。但是,T2无法使用来查看T1所做的任何更改
SELECt

我几乎同时在2个独立的SQL连接中执行了以下语句:

BEGIN;SELECT * FROM names;SELECT pg_sleep(10);INSERT INTO names values('john');SELECT pg_sleep(10);COMMIT;

一个成功,但是另一个失败在10秒后,具有:

ERROR:  duplicate key value violates unique constraint "names_pkey"DETAIL:  Key (name)=(john) already exists.

这是有道理的,因为文档说:

如果尚未提交的事务已插入有冲突的行,则可能的插入程序必须等待以查看该事务是否已提交。如果回滚,则没有冲突。如果提交但未再次删除冲突的行,则表示存在唯一性冲突。

但是,如果将唯一性约束标记为可延迟,则将在COMMIT时检查唯一性:

如果唯一性约束是可延迟的,那么还会有额外的复杂性:我们需要能够为新行插入索引条目,但是将任何违反唯一性的错误推迟到语句结束时或更晚。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5649688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存