Oracle
 sql >> Baza danych >  >> RDS >> Oracle

ORA-08177:nie można zserializować dostępu dla tej transakcji

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:

  1. Alice otwiera sesję przeglądarki, która wywołuje DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob otwiera swoją sesję, która wywołuje DELETE FROM TABLE1 WHERE Version = 'v1' po Alice zrobiła to, ale zanim się popełniła.

    Bob transakcja czeka od Alice zablokowano wiersze za pomocą Version = 'v1'

    • Alice dokonuje transakcji

    • Bob transakcja nie powiodła się z Cannot 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zapytanie Oracle sql, aby wyświetlić wszystkie daty z poprzedniego miesiąca

  2. ORA-00903:nieprawidłowa nazwa tabeli w PreparedStatement

  3. ORA-01264:Nie można utworzyć nazwy pliku dziennika

  4. Uzyskiwanie błędu — ORA-01858:znaleziono znak nienumeryczny w miejscu, w którym oczekiwano wartości liczbowej

  5. Oracle:Jak sprawdzić, czy istnieje oczekująca transakcja?