如果将 BLOCKING 选项设置为 on,则如果事务尝试获取写入锁,而该写入锁与另一事务当前持有的写入锁冲突,则该事务需一直等待,直到冲突锁被释放或达到 BLOCKING_TIMEOUT 阈值。缺省情况下,BLOCKING 设置为 off。
连接阻塞将请求事务置于休眠状态(阻塞 表级或行级锁),直到持有锁的连接释放相应锁(取消阻塞 表级或行级锁)。通过设置 BLOCKING_TIMEOUT 值(以毫秒为单位)来控制阻塞时长。如果 BLOCKING_TIMEOUT 为 0(缺省值),连接中的所有阻塞事务需要无限期等待,直至该连接获得请求的锁。如果设置了 BLOCKING_TIMEOUT,但在指定时间内未释放锁,正在等待的事务会收到一条错误消息。
阻塞利用了延迟事务版本控制,事务管理器将在建立表级或行级锁后创建事务快照版本。
以下面的表级锁阻塞为例:
INSERT INTO iq_table1 VALUES( 3, 300);。
INSERT INTO iq_table1 VALUES( 4, 400);。
禁用连接阻塞时,用户 B 的事务将回退,他会收到一条错误,指出另一用户对 iq_table1 具有锁。
启用连接阻塞(并将 BLOCKING_TIMEOUT 设置为 0)时,用户 B 的 INSERT 语句置于休眠状态,直到用户 A 的 INSERT 语句提交,从而释放表写入锁。
启用连接阻塞且 BLOCKING_TIMEOUT 设置为 200 毫秒时,如果用户 A 的事务在 200 毫秒阻塞超时阈值内未提交,则用户 B 的事务回退,同时收到一条错误,指出另一用户对 iq_table1 具有锁。
有关行级锁的示例,请参见《SAP IQ 管理:内存行级版本控制》>“管理 RLV 存储库中的阻塞”。