Du bruger en serialiserbar transaktion, som venter på, at en anden transaktion låser den samme tabel for at ROLLBACK
.
Hvis denne anden transaktion ikke rulles tilbage, men i stedet forpligtes, får du denne fejl.
Scenariet ser ud til at være følgende:
-
Alice
åbner hendes browsersession, som kalderDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
åbner sin session, som kalderDELETE FROM TABLE1 WHERE Version = 'v1'
efterAlice
gjorde det, men før hun forpligtede sig.
Bob
s transaktion venter sidenAlice
låste rækkerne medVersion = 'v1'
-
Alice
begår sin transaktion -
Bob
s transaktion mislykkes medCannot serialize access
For at omgå dette skal du indstille TRANSACTION ISOLATION LEVEL
til READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
I dette tilfælde Bob
's forespørgsel vil blive genudstedt efter Alice
begår sine ændringer, som om Bob
s transaktion blev startet efter Alice
sin ene var begået.
Opdater
Kan du sende et spor af din forbindelse?
For at gøre dette skal du afgive denne kommando lige efter tilslutning:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, se derefter i $ORACLE_HOME\admin\udump
for en ny *.trc
fil