Używasz transakcji możliwej do serializacji, która czeka na inną transakcję blokującą tę samą tabelę do ROLLBACK
.
Jeśli ta druga transakcja nie zostanie wycofana, ale zostanie zatwierdzona, pojawi się ten błąd.
Scenariusz wygląda następująco:
-
Alice
otwiera sesję przeglądarki, która wywołujeDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
otwiera swoją sesję, która wywołujeDELETE FROM TABLE1 WHERE Version = 'v1'
poAlice
zrobiła to, ale zanim się popełniła.
Bob
transakcja czeka odAlice
zablokowano wiersze za pomocąVersion = 'v1'
-
Alice
dokonuje transakcji -
Bob
transakcja nie powiodła się zCannot serialize access
Aby obejść ten problem, ustaw TRANSACTION ISOLATION LEVEL
do READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
W tym przypadku Bob
zapytanie zostanie ponownie wydane po Alice
zatwierdza swoje zmiany, jakby Bob
transakcja została rozpoczęta po Alice
jeden został popełniony.
Aktualizacja
Czy możesz opublikować ślad swojego połączenia?
Aby to zrobić, wydaj to polecenie zaraz po połączeniu:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, a następnie spójrz w $ORACLE_HOME\admin\udump
dla świeżego *.trc
plik