Sie verwenden eine serialisierbare Transaktion, die auf eine andere Transaktion wartet, die dieselbe Tabelle auf ROLLBACK
sperrt .
Wenn diese andere Transaktion kein Rollback durchführt, sondern stattdessen festschreibt, erhalten Sie diesen Fehler.
Das Szenario scheint wie folgt zu sein:
-
Alice
öffnet ihre Browsersitzung, dieDELETE FROM TABLE1 WHERE Version = 'v1'
aufruftBob
öffnet seine Sitzung, dieDELETE FROM TABLE1 WHERE Version = 'v1'
aufruft nachAlice
tat es, aber bevor sie sich verpflichtete.
Bob
Die Transaktion von wartet seitAlice
die Zeilen mitVersion = 'v1'
gesperrt-
Alice
begeht ihre Transaktion -
Bob
Die Transaktion von schlägt mitCannot serialize access
fehl
Um dies zu umgehen, stellen Sie TRANSACTION ISOLATION LEVEL
ein zu READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
In diesem Fall Bob
Die Abfrage von wird nach Alice
erneut ausgegeben übergibt ihre Änderungen, als ob Bob
Die Transaktionen von wurden nach Alice
gestartet 's wurde festgeschrieben.
Aktualisieren
Könnten Sie bitte einen Trace Ihrer Verbindung posten?
Geben Sie dazu diesen Befehl direkt nach dem Verbinden ein:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, dann suchen Sie in $ORACLE_HOME\admin\udump
für eine neue *.trc
Datei