Могу ли я получить ORA-08177, если есть только одно соединение с базой данных? - PullRequest
2 голосов
/ 16 июня 2009

Мне было поручено запустить модульные тесты на штормовом бэкенде для оракула, чтобы мы могли убедиться, что бэкэнд имеет достаточное качество для использования в производстве. Одна проблема, с которой я сталкиваюсь, заключается в том, что я получаю ORA-08177 (не могу сериализовать доступ для этой транзакции), если я подключаюсь в сериализуемом режиме. Проблема исчезает, когда я использую режим фиксации чтения.

Теперь я прочитал эту статью о спросе , и это указывает на то, что это в основном проблема параллелизма.

Предполагая, что у меня только один поток, соединяющийся с базой данных, и никто другой в мире подключается к этой базе данных, возможно ли получить эту ошибку? И если да, может ли кто-нибудь предоставить мне пример запроса, который будет генерировать эту ошибку?

Или это вероятно указывает на то, что курсор или соединение где-то не закрыто? Или транзакция не была подтверждена или отменена?

Ответы [ 2 ]

1 голос
/ 19 июня 2009

"Там задействованы триггеры, но я получаю ошибки в инструкциях DDL, а не при обновлении или вставке."

Операторы DDL должны обрабатывать свои собственные фиксации. По сути, они выполняют фиксацию, затем изменения метаданных (которые могут включать в себя несколько базовых объектов), а затем снова фиксацию (при условии, что DDL завершается успешно - в случае неудачи изменение должно быть отменено).

Таким образом, если вы выполняли DDL, то было бы безопасно зафиксировать, изменить транзакцию на чтение подтвержденной, выполнить DDL, а затем изменить транзакцию обратно на сериализуемую. Если вы можете дать полный контрольный пример (или хотя бы тот тип DDL, о котором вы говорите), это может помочь. Например, создание материализованного представления или CREATE TABLE AS SELECT может быть «нечетным», так как это будет DDL (с его специфической фиксацией) плюс DML.

1 голос
/ 16 июня 2009

Только с одним сеансом вы не должны получить эту ошибку. Следующий скрипт, однако, создаст вторичный сеанс, который обновит строку независимо от первого сеанса, что позволит нам запустить ORA-8177. Я не уверен, что это то, что вы хотите.

Рассмотрим:

SQL> alter session set isolation_level=serializable;

Session altered
SQL> create table test (a number);

Table created
SQL> insert into test values (1);

1 row inserted
SQL> commit;

Commit complete
SQL> declare
  2     pragma autonomous_transaction;
  3  begin
  4     update test set a = 2;
  5     commit;
  6  end;
  7  /

PL/SQL procedure successfully completed
SQL> update test set a = 3;

update test set a = 3

ORA-08177: can't serialize access for this transaction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...