Oracle
 sql >> база данни >  >> RDS >> Oracle

ORA-08177:не може да сериализира достъпа за тази транзакция

Използвате сериализираща се транзакция, която изчаква друга транзакция, която заключи същата таблица за ROLLBACK .

Ако тази друга транзакция не се върне назад, а вместо това се ангажира, ще получите тази грешка.

Сценарият изглежда е следният:

  1. Alice отваря сесията на браузъра си, която извиква DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob отваря своята сесия, която извиква DELETE FROM TABLE1 WHERE Version = 'v1' след Alice направи го, но преди да се ангажира.

    Bob Транзакцията на 's чака от Alice заключи редовете с Version = 'v1'

    • Alice извършва транзакцията си

    • Bob Транзакцията на ' е неуспешна с Cannot serialize access

За да заобиколите това, задайте TRANSACTION ISOLATION LEVEL до READ COMMITTED :

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

В този случай Bob Заявката на ' ще бъде преиздадена след Alice извършва нейните промени, сякаш Bob Транзакциите на 's са стартирани след Alice Един от тях е извършен.

Актуализиране

Бихте ли публикували следа на връзката си?

За да направите това, издайте тази команда веднага след свързване:

(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();

, след което погледнете в $ORACLE_HOME\admin\udump за нов *.trc файл




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Динамичен SQL LOOP

  2. Хибернация Timestamp с часова зона

  3. Как можете да изпълнявате една и съща заявка няколко пъти, като използвате цикъл в PL/SQL?

  4. Създаване на база данни на Oracle 12c – стъпка по стъпка

  5. Разделяне на низ по интервал и знак като разделител в Oracle с regexp_substr