DELETE 操作的步骤与 INSERT 操作的步骤几乎相同,只是顺序相反。与插入和更新相同,所有事务都将执行以下一系列的操作,而无论其隔离级别为何。
在表上获取共享模式锁(如果尚未持有)。
在表上获取意图写表锁(如果尚未持有)。
标识要更新的候选行。当扫描行时,将它们锁定。
在隔离级别 2 和 3,会出现与缺省锁定行为不同的以下差异:将获取意图写行级锁定而非读锁定,并且可能会在最终被拒绝作为更新候选行的行上获取意图写锁定。
对于在步骤 2.a 中标识的每个候选行,遵循其余的顺序。
在要删除的行上放置写锁定。
从表中删除该行,这样其它事务就无法再看到该行。在提交该事务之前不能销毁该行,因为这样做之后将无法再回退该事务。会保留已删除行的索引条目,但会将其标记为已删除,直到事务完成。这可防止其它事务重新插入相同的行。
如果该表是参照完整性关系中的主表,且关系的 DELETE 操作不是 RESTRICT,则确定外表中受影响的行(通过以下操作:首先在外表上获取共享模式锁,然后在每个表上获取意图写表锁),然后在所有受影响的行上获取写锁定,并根据需要修改各行。请注意,此过程可能分多级进行参照完整性约束的嵌套层次。
只要不违反参照完整性,就可以提交该事务。为校验参照完整性,数据库服务器还会跟踪该删除操作产生的遗孤。COMMIT 后,服务器会将该操作记录在事务日志文件中并释放所有的锁。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |