Du använder en serialiserbar transaktion som väntar på att någon annan transaktion låser samma tabell för att ROLLBACK
.
Om den här andra transaktionen inte återställs utan commits istället får du det här felet.
Scenariot verkar vara följande:
-
Alice
öppnar hennes webbläsarsession som anroparDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
öppnar sin session som anroparDELETE FROM TABLE1 WHERE Version = 'v1'
efterAlice
gjorde det men innan hon begick sig.
Bob
s transaktion väntar sedanAlice
låste raderna medVersion = 'v1'
-
Alice
begår sin transaktion -
Bob
s transaktion misslyckas medCannot serialize access
För att kringgå detta, ställ in TRANSACTION ISOLATION LEVEL
till READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
I det här fallet, Bob
s fråga kommer att skickas på nytt efter Alice
begår sina ändringar, som om Bob
s transaktion startades efter Alice
sin ena begicks.
Uppdatera
Kan du skicka ett spår av din anslutning?
För att göra detta, utfärda detta kommando direkt efter anslutning:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, titta sedan i $ORACLE_HOME\admin\udump
för en ny *.trc
fil