gpt4 book ai didi

database - 读取未提交的 mvcc 数据库

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:56 26 4
gpt4 key购买 nike

假设我想在读取提交模式(在 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 中不允许将读锁增加到写锁。

我认为我的假设是错误的……这个场景在哪里等待或者一个事务被杀死?未提交读取不应允许丢失更新,但我看不出这是如何工作的。

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

最佳答案

I would exspect that T2 has to wait at r(A). Because T1 would set an exclusive lock for A at the first read, because it wants to write it later. But with MVCC there are no read locks?

如果您在 select 语句中指定 for update,则会有写锁。在这种情况下,如果 r2(A) 试图锁定与 r1(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

关于database - 读取未提交的 mvcc 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6074242/

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