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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用事务和隔离级别 » 锁定的工作方式

 

删除过程中的锁定

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

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

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

    1. 标识要更新的候选行。当扫描行时,将它们锁定。缺省锁定行为如隔离级别和一致性所述。

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

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

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

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

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

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