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,您可以在没有锁的情况下获得一致的读取,但在写入时仍然需要锁。
在尝试做任何事情之前,第二个事务将等待第一个事务完成(例如:COMMIT 或 ROLLBACK)。所以在这种情况下,T2 上的光标会”挂起”更新,等待 T1 完成。
您将在 T1 提交后获得一个新的 SCN,在 T2 提交后获得另一个。
- 谢谢。所以,MVCC 意味着这个锁不会影响读取,对吧?只是对同一记录的其他写入,其中 id = 3?
- @RonGarrity 是的。 Oracle 可以使用撤消日志为连接到它的所有会话提供数据库的读取一致视图。
来源:https://www.codenong.com/7523189/
