我有一个查询
SELECT FIRST 10 * FROM FP_TASKS WITH LOCK
但我有多个客户端使用表,我需要每个选定的客户端10行未锁定.. 有没有办法做下面的事情?
SELECT FIRST 10 * FROM FP_TASKS
WHERE ROW NOT LOCKED
WITH LOCK
答案 0 :(得分:1)
如果您持有一个锁,那么另一个事务中的另一个select .. with lock
将等待释放锁定或引发异常(取决于事务配置)。
选择时无法忽略或跳过锁定的行。 Firebird documentation也明确说:
WITH LOCK提供有限的显式悲观锁定功能 在受影响的行集为:
的条件下谨慎使用一个。非常小(理想情况下,单身),和 湾由应用程序代码精确控制。
您的查询既不是“非常小”,也不是您的应用程序“精确控制”。
您应该考虑使用短事务来分配行,该事务使用某种类型的特定于连接的声明更新行,或者可能是将行分配给特定客户端的单个生产者或资源管理器。