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 nachAlicetat es, aber bevor sie sich verpflichtete.
BobDie Transaktion von wartet seitAlicedie Zeilen mitVersion = 'v1'gesperrt-
Alicebegeht ihre Transaktion -
BobDie Transaktion von schlägt mitCannot serialize accessfehl
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