读取未提交的mvcc数据库

5 database postgresql transactions mvcc

假设我想以读提交模式(在 postgres 中)执行以下事务。

T1: r(A) -> w(A)
T2: r(A) -> w(A)
Run Code Online (Sandbox Code Playgroud)

如果按以下顺序调用操作:

r1(A)->r2(A)->w1(A)->c1->w2(A)->c2
Run Code Online (Sandbox Code Playgroud)

我预计 T2 必须在 r(A) 处等待。因为T1会在第一次读取时为A设置排他锁,因为它想稍后再写入。但是使用 MVCC 就没有读锁了吗?

现在我有两个问题:

如果我使用 JDBC 读取一些数据,然后执行一个单独的命令来插入读取的数据。数据库如何知道它只在读时必须进行排他锁?据我所知,2PL 中不允许将读锁增加为写锁。

我认为我的假设是错误的......这种情况在哪里等待或者一笔交易被杀死?未提交的读取不应允许丢失更新,但我看不出这是如何工作的。

如果有人能帮助我,我会很高兴。谢谢

Den*_*rdy 1

我预计 T2 必须在 r(A) 处等待。因为T1会在第一次读取时为A设置排他锁,因为它想稍后再写入。但是使用 MVCC 就没有读锁了吗?

for update如果您在 select 语句中指定,则存在写锁。在这种情况下,如果 r2(A) 尝试锁定与 r1(A) 相同的行,则 r2(A) 将等待读取。

http://www.postgresql.org/docs/9.0/interactive/explicit-locking.html

如果两个事务开始并最终请求对方已经锁定的行,则会发生死锁:

r11(A) -> r22(A) -> r12(A) (same as r22) vs r21(A) (same as r11) -> deadlock
Run Code Online (Sandbox Code Playgroud)