假设我想以读取提交模式(在 postgres 中)执行以下事务。
T1: r(A) -> w(A)
T2: r(A) -> w(A)
如果按此顺序调用操作:
r1(A)->r2(A)->w1(A)->c1->w2(A)->c2
我预计 T2 必须在 r(A) 处等待。因为 T1 在第一次读取时会为 A 设置一个排他锁,因为它想稍后再写入。但是使用 MVCC 就没有读锁了吗?
现在我有两个问题:
如果我使用 JDBC 读取一些数据,然后执行一个单独的命令来插入读取的数据。数据库如何知道它只在读取时必须进行排他锁?据我所知,在 2PL 中不允许将读锁增加到写锁。
我认为我的假设是错误的......这种情况在哪里等待或一个事务被杀死?未提交的读取不应该允许丢失更新,但我看不出这是如何工作的。
如果有人可以帮助我,我会很高兴。谢谢