U gebruikt een serialiseerbare transactie die wacht op een andere transactie die dezelfde tabel vergrendelt op ROLLBACK
.
Als deze andere transactie niet wordt teruggedraaid maar in plaats daarvan wordt vastgelegd, krijgt u deze foutmelding.
Het scenario lijkt als volgt te zijn:
-
Alice
opent haar browsersessie dieDELETE FROM TABLE1 WHERE Version = 'v1'
aanroeptBob
opent zijn sessie dieDELETE FROM TABLE1 WHERE Version = 'v1'
aanroept naAlice
deed het maar voordat ze zich beging.
Bob
's transactie wacht sindsAlice
de rijen vergrendeld metVersion = 'v1'
-
Alice
voert haar transactie uit -
Bob
's transactie mislukt metCannot serialize access
Om dit te omzeilen, stelt u TRANSACTION ISOLATION LEVEL
. in om READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
In dit geval Bob
's query wordt opnieuw uitgegeven na Alice
begaat haar wijzigingen, alsof Bob
's transactie zijn gestart na Alice
die van haar is gepleegd.
Bijwerken
Kun je een spoor van je verbinding posten?
Om dit te doen, geeft u deze opdracht direct na het verbinden:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, kijk dan in $ORACLE_HOME\admin\udump
voor een nieuwe *.trc
bestand