【问题标题】:Concurrent Updates in Oracle: Locking or not?Oracle 中的并发更新:锁定与否?
【发布时间】:2011-11-23 07:17:52
【问题描述】:

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

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

【问题讨论】:

    标签: database oracle concurrency transactions


    【解决方案1】:

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

    第二个事务将等待第一个事务完成(例如:COMMITROLLBACK),然后再尝试执行任何操作。所以在这种情况下,T2 上的光标会“挂”在更新上,等待 T1 完成。

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

    【讨论】:

    • 谢谢。所以,MVCC 意味着这个锁不会影响读取,对吧?只是对同一记录的其他写入,其中 id = 3?
    • @RonGarrity 是的。 Oracle 可以使用撤消日志为连接到它的所有会话提供数据库的读取一致视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多