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