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'efterAlicegjorde det men innan hon begick sig.
Bobs transaktion väntar sedanAlicelåste raderna medVersion = 'v1'-
Alicebegår sin transaktion -
Bobs 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