Използвате сериализираща се транзакция, която изчаква друга транзакция, която заключи същата таблица за ROLLBACK
.
Ако тази друга транзакция не се върне назад, а вместо това се ангажира, ще получите тази грешка.
Сценарият изглежда е следният:
-
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
файл