关于数据库:Oracle 中的并发更新:锁定与否?

Concurrent Updates in Oracle: Locking or not?

我很困惑。我正在阅读有关 Oracle 中的 MVCC 的信息。我认为 MVCC 意味着没有锁。但是,我在其他地方读到所有 UPDATE 都会自动锁定,而不管隔离级别如何。有人可以解释在 Oracle 更新期间会发生什么吗?当多个读取提交事务尝试执行并发 update t set c = c + 1 where id = 3 时会发生什么。结果是什么,在任一事务之前给定 c = 1,锁和 SCN 发生了什么?

1
2
3
4
5
6
Begin T1
Begin T2
T1:  update t set c = c + 1 where id = 3
T2:  update t set c = c + 1 where id = 3
Commit T1
Commit T2

你是对的,无论隔离级别如何,这都会锁定行。使用 MVCC,您可以在没有锁的情况下获得一致的读取,但在写入时仍然需要锁。

在尝试做任何事情之前,第二个事务将等待第一个事务完成(例如:COMMITROLLBACK)。所以在这种情况下,T2 上的光标会"挂起"更新,等待 T1 完成。

您将在 T1 提交后获得一个新的 SCN,在 T2 提交后获得另一个。