【发布时间】:2018-02-10 15:15:30
【问题描述】:
我有一个问题
SELECT FIRST 10 * FROM FP_TASKS WITH LOCK
但是我有多个客户端使用一个表,我需要为每个选定的客户端设置 10 行未锁定的行。 有什么办法可以做下面这样的事情吗?
SELECT FIRST 10 * FROM FP_TASKS
WHERE ROW NOT LOCKED
WITH LOCK
【问题讨论】:
-
SELECT FIRST 10 * FROM FP_TASKS- 这意味着“随机选择 10 行” - 因为您没有指定任何顺序 -
Firebird 是多版本服务器,锁定对它来说是不自然的。我想,你最好重新考虑一下你的应用程序的操作模式。如果您真的需要它,您可以在表中添加列,锁定该行的连接 ID。对于 IB/FB 来说,这似乎仍然是相当不自然的工作流程
-
我相信最好的方法是识别连接,正如你所说。我的应用程序有一个使用该表的子进程,我们连接的客户端可以在其中相互分配工作负载,因此客户端可以选择任何行以任何特定顺序进行处理。谢谢!
-
然后还可以查看数据库级触发器,如果您的客户端或其连接崩溃,那么服务器应该释放该连接的锁定
-
我在“断开连接”事件上添加了一个触发器,并且效果很好:) ty
标签: sql firebird deadlock database-deadlocks