2017-09-01 5 views
1

Ich habe eine AbfrageFirebird Sperre und wählen Sie entriegelten Felder

SELECT FIRST 10 * FROM FP_TASKS WITH LOCK 

aber ich habe mehrere Clients unter Verwendung einer Tabelle, und ich brauche für jeden ausgewählten Client 10 Zeilen, die nicht gesperrt sind .. Gibt es eine Möglichkeit zu etwas wie unten tun?

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

'SELECT FIRST 10 * FROM FP_TASKS' - das bedeutet "beliebige 10 Zeilen auswählen" - weil Sie keine Reihenfolge angegeben haben –

+0

Firebird ist Multi-Version Server, Sperren ist nicht natürlich für sie. Ich denke, Sie sollten die Funktionsweise Ihrer Anwendungen überdenken. Wenn Sie es wirklich so sehr brauchen, können Sie Spalte in die Tabelle hinzufügen, Verbindungs-ID, die diese Zeile gesperrt hat. Trotzdem scheint es ein eher unnatürlicher Workflow für IB/FB –

+0

zu sein Ich glaube der beste Weg wird sein, die Verbindung zu identifizieren, wie du schon sagtest. Meine Anwendung verfügt über einen Subprozess, der diese Tabelle verwendet, wobei unsere verbundenen Clients die Arbeitslast einander zuordnen können, sodass der Client eine beliebige Zeile auswählen kann, die in einer bestimmten Reihenfolge verarbeitet werden soll. Vielen Dank! –

Antwort

1

Wenn Sie eine Sperre eine Reihe halten, dann eine andere select .. with lock in einer anderen Transaktion wird entweder warten, bis die Sperre aufgehoben werden oder eine Ausnahme (abhängig von der Transaktion Konfiguration) erhöhen.

Es gibt keine Möglichkeit, gesperrte Zeilen bei der Auswahl zu ignorieren oder zu überspringen. Die Firebird documentation sagt auch ausdrücklich:

MIT LOCK eine begrenzte explizite pessimistische Sperrfähigkeit für vorsichtigen Einsatz unter Bedingungen bietet, wo die betroffene Reihe Satz ist:

a. extrem klein (idealerweise ein Singleton) und
b. genau gesteuert durch den Anwendungscode.

Ihre Anfrage ist von Ihrer Anwendung weder "extrem klein" noch "genau gesteuert".

Sie sollten in Erwägung ziehen, eine Zeile mit einer kurzen Transaktion zuzuweisen, bei der die Zeile mit einem verbindungsspezifischen Anspruch aktualisiert wird, oder mit einem einzelnen Produzenten oder Ressourcenmanager, der einem bestimmten Client Zeilen zuordnet.

Verwandte Themen