【发布时间】:2012-01-14 19:36:45
【问题描述】:
执行 DELETE 查询时,数据究竟是从哪里删除的?为什么数据在其他会话中仍然可见?在 Oracle SQL(架构级别)中触发 DELETE 查询时执行的后台进程是什么?
【问题讨论】:
标签: sql oracle session sql-delete
执行 DELETE 查询时,数据究竟是从哪里删除的?为什么数据在其他会话中仍然可见?在 Oracle SQL(架构级别)中触发 DELETE 查询时执行的后台进程是什么?
【问题讨论】:
标签: sql oracle session sql-delete
除了讨论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 纪元以来的秒数”值)。当该事务正在运行时,它不会看到任何在其开始时间之后插入的带有时间戳的数据。系统为仍在运行的事务保留以前版本的数据页。当事务写入一个页面时,它会创建一个带有新时间戳的新副本,但在修改事务提交之前,该副本对其他事务不可用,即使这样,它也仅对提交后开始的事务可用。
【讨论】:
命令一发出,本地会话的行就被删除,但直到COMMIT,其他会话才会删除。
【讨论】: