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.
'SELECT FIRST 10 * FROM FP_TASKS' - das bedeutet "beliebige 10 Zeilen auswählen" - weil Sie keine Reihenfolge angegeben haben –
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 –
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! –