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:
-
Aliceotwiera sesję przeglądarki, która wywołujeDELETE FROM TABLE1 WHERE Version = 'v1'Bobotwiera swoją sesję, która wywołujeDELETE FROM TABLE1 WHERE Version = 'v1'poAlicezrobiła to, ale zanim się popełniła.
Bobtransakcja czeka odAlicezablokowano wiersze za pomocąVersion = 'v1'-
Alicedokonuje transakcji -
Bobtransakcja 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