使用 RETAIN UPDATE LOCKS 选项

当数据库服务器处理 SELECT ... FOR UPDATE 语句时,使用 RETAIN® UPDATE LOCKS 选项来影响它的行为。

在隔离级别设置为 Dirty Read、Committed Read 或 Cursor Stability 的数据库中,数据库服务器在 SELECT ... FOR UPDATE 语句获取的行上放置更新锁。当您开启 RETAIN UPDATE LOCKS 选项时,数据库服务器保持更新锁,直到事务结束为止,而不是在下一随后的 FETCH 时或当关闭游标时才释放它。此选项防止在当前的用户到达事务的结束之前其他用户在更新了的行上放置排他锁。

您可使用此选项来获得相同的锁定效果,但避免 dummy 更新或可重复读隔离级别的开销。

在当前的会话期间的任何时刻,您都可开启或关闭此选项。

您可通过重置隔离级别而不使用 RETAIN UPDATE LOCKS 关键字来关闭该选项,如下例中所示。
BEGIN WORK;
        SET ISOLATION TO 
        COMMITTED READ LAST COMMITTED RETAIN UPDATE LOCKS;
        ...
        COMMIT WORK;
        BEGIN WORK;
        SET ISOLATION TO COMMITTED READ LAST COMMITTED ;
        ...
        COMMIT WORK;
      

通过会话环境控制更新锁

禁用 RETAIN UPDATE LOCKS 行为的另一种方法是执行此 SQL 语句:
SET ENVIRONMENT RETAINUPDATELOCKS 'NONE';
通过重置 RETAINUPDATELOCKS 会话环境变量,这为当前的事务,或为同一会话的任意随后的事务禁用 RETAIN UPDATE LOCKS 子句。

SET ENVIRONMENT RETAINUPDATELOCKS 语句还可使得更新锁的保持成为 Committed Read、Cursor Stability 或 Dirty Read 隔离级别,或对于所有这些隔离级别的缺省行为,不论 SET ISOLATION 语句是否包括 RETAIN UPDATE LOCKS 子句。

要获取更多关于更新锁的信息,请参阅 RETAINUPDATELOCKS 环境选项锁定注意事项