Ich verwende eine Microsoft SQL Server 2005-Datenbank mit Isolationsstufe READ_COMMITTED
und READ_COMMITTED_SNAPSHOT=ON
.
Jetzt möchte ich verwenden:
SELECT * FROM <tablename> FOR UPDATE
... damit andere Datenbankverbindungen blockieren, wenn versucht wird, auf dieselbe Zeile "FOR UPDATE" zuzugreifen.
Ich habe es versucht:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
... aber dies blockiert alle anderen Verbindungen, auch wenn eine andere ID als "1" ausgewählt wird.
Welches ist der richtige Hinweis SELECT FOR UPDATE
für Oracle, DB2, MySql?
EDIT 2009-10-03:
Dies sind die Anweisungen zum Erstellen der Tabelle und des Index:
CREATE TABLE example ( Id BIGINT NOT NULL, TransactionId BIGINT,
Terminal BIGINT, Status SMALLINT );
ALTER TABLE example ADD CONSTRAINT index108 PRIMARY KEY ( Id )
CREATE INDEX I108_FkTerminal ON example ( Terminal )
CREATE INDEX I108_Key ON example ( TransactionId )
Viele parallele Prozesse tun dies SELECT
:
SELECT * FROM example o WITH (updlock) WHERE o.TransactionId = ?
EDIT 2009-10-05:
Zur besseren Übersicht habe ich alle erprobten Lösungen in der folgenden Tabelle aufgeführt:
Mechanismus | SELECT für verschiedene Zeilenblöcke | SELECT für dieselben Zeilenblöcke ----------------------- + -------------------------- ------ + -------------------------- ROWLOCK | nein | Nein Updlock, Rowlock | ja | Ja xlock, rowlock | ja | Ja repeatableread | nein | Nein DBCC TRACEON (1211, -1) | ja | Ja Rowlock, Xlock, Holdlock | ja | Ja Updlock, Holdlock | ja | Ja UPDLOCK, READPAST | nein | Nein Ich suche | nein | Ja