【问题标题】:In Oracle SQL, why are the deleted (uncommitted) rows not visible in current session but visible in other sessions?在 Oracle SQL 中,为什么已删除(未提交)的行在当前会话中不可见但在其他会话中可见?
【发布时间】:2012-01-14 19:36:45
【问题描述】:

执行 DELETE 查询时,数据究竟是从哪里删除的?为什么数据在其他会话中仍然可见?在 Oracle SQL(架构级别)中触发 DELETE 查询时执行的后台进程是什么?

【问题讨论】:

标签: sql oracle session sql-delete


【解决方案1】:

除了讨论ziesemer 向您推荐的ACID 属性,您还应该了解Multi-Version Concurrency Control 或MVCC。如果您想了解“一切”,请考虑阅读 Philip A. Bernstein、Vassos Hadzilacos、Nathan Goodman 的 Concurrency Control and Recovery in Database Systems(可供下载)。

在 Oracle 和其他类似的 MVCC DBMS 中,当您启动事务时,会保留一个时间戳记,该时间戳标识该开始时间(但时间戳值不一定是简单的“自 Unix 纪元以来的秒数”值)。当该事务正在运行时,它不会看到任何在其开始时间之后插入的带有时间戳的数据。系统为仍在运行的事务保留以前版本的数据页。当事务写入一个页面时,它会创建一个带有新时间戳的新副本,但在修改事务提交之前,该副本对其他事务不可用,即使这样,它也仅对提交后开始的事务可用。

【讨论】:

    【解决方案2】:

    您可能想熟悉一下ACID - 特别是Isolation。如果您希望它对其他会话可见,请务必在删除后进行提交。

    由于上面链接的标准,数据在其他会话中仍然可见。

    【讨论】:

      【解决方案3】:

      命令一发出,本地会话的行就被删除,但直到COMMIT,其他会话才会删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 2014-01-29
        • 1970-01-01
        • 2011-08-17
        • 2020-12-23
        • 2016-02-18
        • 1970-01-01
        相关资源
        最近更新 更多