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

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 使用事务和隔离级别 » 锁定的工作方式 » 行锁

 

读锁定

当事务读取某行时,事务的隔离级别会确定是否获取读锁定。在某一行被放置了读锁定后,任何其它事务都不能在该行上获取写锁定。获取读锁定可确保另一个事务不会修改或删除正在被读取的行。任意数量的事务可以同时在任意一行上获取读锁定,因此读锁定有时也称为共享锁,或非独占锁。

读锁定可保持不同的时间。在隔离级别 2 和 3 上,事务获取的任何读锁定会一直保持到事务通过 COMMIT 或 ROLLBACK 完成为止。这些读锁定称为长期读锁定。

对于以隔离级别 1 执行的事务,数据库服务器在游标所在的行上获取短期读锁定。随着应用程序滚动游标,会释放前面行上的短期读锁定,并在后面的行上获取新的短期读锁定。此技术称作游标稳定性。因为应用程序在当前行上保持读锁定,所以在应用程序离开该行之前,其它事务无法对该行进行更改。请注意,如果游标是通过涉及多个表的查询打开的,则可获取多个锁定。仅当必须在请求(通常,这些请求是应用程序发出的 FETCH 语句)间保持游标位置时,才获取短期读锁定。例如,处理 SELECT COUNT(*) 查询时不会获取短期读锁定,因为通过此语句打开的游标将永远不会位于特定的基表行上。这种情况下,数据库服务器仅需要保证读取已提交的语义,即该语句处理的行已被其它事务提交。

以隔离级别 0(读取未提交数据)执行的事务不会获取长期读锁定或短期读锁定,因此也不会与其它事务冲突(除了独占模式锁)。但是,隔离级别 0 事务可能处理其它并发事务所做的未提交的更改。可以使用快照隔离避免处理未提交的更改。请参见快照隔离