Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-08177:Der Zugriff für diese Transaktion kann nicht serialisiert werden

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:

  1. Alice öffnet ihre Browsersitzung, die DELETE FROM TABLE1 WHERE Version = 'v1' aufruft

    • Bob öffnet seine Sitzung, die DELETE FROM TABLE1 WHERE Version = 'v1' aufruft nach Alice tat es, aber bevor sie sich verpflichtete.

    Bob Die Transaktion von wartet seit Alice die Zeilen mit Version = 'v1' gesperrt

    • Alice begeht ihre Transaktion

    • Bob Die Transaktion von schlägt mit Cannot 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