我有疑问
SELECT FIRST 10 * FROM FP_TASKS WITH LOCK
但是我有多个客户端使用一个表,并且我需要为每个选定的客户端 10 行未锁定。 有什么办法可以做到下面这样吗?
SELECT FIRST 10 * FROM FP_TASKS
WHERE ROW NOT LOCKED
WITH LOCK
如果您持有一行锁,则另一个事务中的另一个
select .. with lock
将等待锁被释放或引发异常(取决于事务配置)。
在 Firebird 4.0 及更早版本中,选择时无法忽略或跳过锁定的行。 Firebird 文档 还明确指出:
WITH LOCK 提供有限的显式悲观锁定能力 在受影响的行集为以下情况时谨慎使用:
a.非常小(理想情况下是单例),并且
b.由应用程序代码精确控制。
您的查询既不是“极小”,也不是由应用程序“精确控制”。
您应该考虑使用短事务来分配行,该事务使用某种类型的特定于连接的声明更新行,或者可能使用单个生产者或资源管理器将行分配给特定客户端。
从 Firebird 5.0 开始,
SKIP LOCKED
有一个可选子句
WITH LOCK
,它允许您跳过锁定的行。