Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 事务和隔离级别 » 锁定的工作方式

 

删除过程中的锁定

DELETE 操作的步骤与 INSERT 操作的步骤几乎相同,只是顺序相反。与插入和更新相同,所有事务都将执行以下一系列的操作,而无论其隔离级别为何。

  1. 在表上获取共享模式锁(如果尚未持有)。

  2. 在表上获取意图写表锁(如果尚未持有)。

    1. 标识要更新的候选行。当扫描行时,将它们锁定。

      在隔离级别 2 和 3,会出现与缺省锁定行为不同的以下差异:将获取意图写行级锁定而非读锁定,并且可能会在最终被拒绝作为更新候选行的行上获取意图写锁定。

    2. 对于在步骤 2.a 中标识的每个候选行,遵循其余的顺序。

  3. 在要删除的行上放置写锁定。

  4. 从表中删除该行,这样其它事务就无法再看到该行。在提交该事务之前不能销毁该行,因为这样做之后将无法再回退该事务。会保留已删除行的索引条目,但会将其标记为已删除,直到事务完成。这可防止其它事务重新插入相同的行。

  5. 如果该表是参照完整性关系中的主表,且关系的 DELETE 操作不是 RESTRICT,则确定外表中受影响的行(通过以下操作:首先在外表上获取共享模式锁,然后在每个表上获取意图写表锁),然后在所有受影响的行上获取写锁定,并根据需要修改各行。请注意,此过程可能分多级进行参照完整性约束的嵌套层次。

只要不违反参照完整性,就可以提交该事务。为校验参照完整性,数据库服务器还会跟踪该删除操作产生的遗孤。COMMIT 后,服务器会将该操作记录在事务日志文件中并释放所有的锁。

 另请参见