2017-09-01 83 views
1

我有一個查詢火鳥鎖定和解鎖選擇領域

SELECT FIRST 10 * FROM FP_TASKS WITH LOCK 

但我有使用表多個客戶端,我需要爲未鎖定每個選定的客戶端10行.. 有什麼辦法做下面的事情?

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

'首先選擇10 * FROM FP_TASKS' - 這意味着「選擇任何隨機的10行」 - 因爲你沒有指定任何順序 –

+0

火鳥是多版本的服務器,鎖定是不自然的。我想,你最好重新考慮應用程序的操作模式。如果你真的需要這麼多,你可以在表中添加列,鎖定這一行的連接ID。不過這似乎是對IB/FB –

+0

相當不自然的工作流程,我相信最好的辦法是確定的連接,如你所說。我的應用程序有一個使用此表的子進程,我們的連接客戶端可以將工作負載分配給對方,因此客戶端可以選擇任何行以任意特定順序進行處理。 謝謝! –

回答

1

如果您持有鎖的行,然後又在select .. with lock其他事務要麼等待被釋放鎖或引發異常(取決於事務配置)。

沒有辦法忽略或選擇時可跳過鎖定行。該Firebird documentation也明確地說:

帶鎖提供了有限的明確悲觀鎖定能力 在條件謹慎使用,其中受影響的行集是:

一個。極小(理想地,一個單),並
灣由應用程序代碼精確控制。

您的查詢既不是「非常小」,也不是由您的應用程序「精確控制」。

您應該考慮分配使用短事務與某種類型的連接特定要求的,或者一個單一的生產者或資源管理器分配行特定的客戶端更新該行的行。