Firebird 锁定并选择解锁字段

问题描述 投票:0回答:1

我有疑问

SELECT FIRST 10 * FROM FP_TASKS WITH LOCK

但是我有多个客户端使用一个表,并且我需要为每个选定的客户端 10 行未锁定。 有什么办法可以做到下面这样吗?

SELECT FIRST 10 * FROM FP_TASKS
 WHERE ROW NOT LOCKED
WITH LOCK
sql firebird deadlock database-deadlocks
1个回答
1
投票

如果您持有一行锁,则另一个事务中的另一个

select .. with lock
将等待锁被释放或引发异常(取决于事务配置)。

在 Firebird 4.0 及更早版本中,选择时无法忽略或跳过锁定的行。 Firebird 文档 还明确指出:

WITH LOCK 提供有限的显式悲观锁定能力 在受影响的行集为以下情况时谨慎使用:

a.非常小(理想情况下是单例),并且
b.由应用程序代码精确控制。

您的查询既不是“极小”,也不是由应用程序“精确控制”。

您应该考虑使用短事务来分配行,该事务使用某种类型的特定于连接的声明更新行,或者可能使用单个生产者或资源管理器将行分配给特定客户端。

从 Firebird 5.0 开始,

SKIP LOCKED
 有一个可选子句 
WITH LOCK
,它允许您跳过锁定的行。

© www.soinside.com 2019 - 2024. All rights reserved.