gpt4 book ai didi

sql - MVCC 数据库是否在事务处理过程中看到插入的行?

转载 作者:行者123 更新时间:2023-12-04 21:19:35 25 4
gpt4 key购买 nike

是否MVCC数据库隔离模式是否允许进行中的事务查看其他事务插入(和提交)的行?

例如,给定:

  • names[id BIGINT NOT NULL, name VARCHAR(30), PRIMARY KEY(id), UNIQUE(name)]
  • 交易 T1 和 T2,
T1: open transaction
T2: open transaction
T1: select * from names;
insert into names(name) values("John");
// do something
commit;
T2: select * from names;
insert into names values("John");
// do something
commit;

T2 何时首先意识到新行?在选择的时候?在插入时?还是在 commit 时?

最佳答案

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

我没有针对其他数据库测试它,但在我的测试中,在 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.

这是有道理的,因为 documentation说:

If a conflicting row has been inserted by an as-yet-uncommitted transaction, the would-be inserter must wait to see if that transaction commits. If it rolls back then there is no conflict. If it commits without deleting the conflicting row again, there is a uniqueness violation.

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

If the unique constraint is deferrable, there is additional complexity: we need to be able to insert an index entry for a new row, but defer any uniqueness-violation error until end of statement or even later.

关于sql - MVCC 数据库是否在事务处理过程中看到插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com