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 的用法 » 使用事务和隔离级别 » 锁定的工作方式

 

位置锁

除了行锁,SQL Anywhere 还会实现一种键范围的锁定方式,旨在防止由于幻像(或称为幻像行)的存在而导致的异常。仅当数据库服务器处理以隔离级别 3 运行的事务时,才涉及到位置锁。

我们称以隔离级别 3 运行的事务是可序列化的。这就意味着隔离级别 3 上事务的行为不应受其它事务的并发更新活动影响。特别是,在隔离级别 3 上,事务不能受引入可影响计算结果的行的 INSERT 或 UPDATE(幻像)所影响。SQL Anywhere 使用位置锁防止此类更新发生。正是通过此附加锁定来区分隔离级别 2(可重复读取)和隔离级别 3。

为了防止创建幻像行,SQL Anywhere 在表的物理扫描中获取位置锁。对于顺序扫描,扫描位置基于当前行的行标识符。对于索引扫描,扫描的位置基于当前行的索引键值(该值可以是唯一的也可以是不唯一的)。通过锁定扫描位置,一个事务可以防止其它事务按照行的顺序执行与特定值范围相关的插入。这包括可更改索引属性值的 INSERT 语句和 UPDATE 语句。扫描位置锁定后,UPDATE 语句可视为请求对索引条目执行 DELETE,随后紧跟一个 INSERT 请求。

SQL Anywhere 支持两类位置锁:幻像锁和防幻像锁。这两类锁都是共享锁,因为任意数量的事务可以在同一行上获取相同类型的锁。但是,幻像锁和防幻像锁互相冲突。


幻像锁
插入锁