Firebird 锁和 select 个解锁字段

Firebird lock and select unlocked fields

我有一个问题

SELECT FIRST 10 * FROM FP_TASKS WITH LOCK

但我有多个客户使用 table,我需要为每个选定的客户提供 10 行未锁定的内容。 有什么办法可以做如下的事情吗?

SELECT FIRST 10 * FROM FP_TASKS
 WHERE ROW NOT LOCKED
WITH LOCK

如果您连续持有锁,那么另一个事务中的另一个 select .. with lock 将等待释放锁或引发异常(取决于事务配置)。

选择时无法忽略或跳过锁定的行。 Firebird documentation 还明确表示:

WITH LOCK provides a limited explicit pessimistic locking capability for cautious use in conditions where the affected row set is:

a. extremely small (ideally, a singleton), and
b. precisely controlled by the application code.

您的申请既不'extremely small'也不'precisely controlled'。

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