Оптимистическая блокировка записи в Oracle - PullRequest
1 голос
/ 25 октября 2011

Я заметил, когда я делаю следующее:

update t set x = 1 where x = 0; // (1) session 1
update t set x = 2 where x = 0; // (2) session 2
commit; // (3) session 2

В строке (2) сеанс 2 будет ожидать сессию (1) для фиксации.

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

В идеале, я хотел бы, чтобы сеанс 2 зафиксировал успешное выполнение, а затем сеанс 1выдает ошибку при попытке фиксации, как описано здесь: Оптимистический контроль параллелизма .

Есть ли способ заставить Oracle вести себя таким образом?(Я использую Oracle 10g, если это имеет значение).

Обоснование и (возможно, плохое) решение

У меня есть ночной процесс репликации, который может влиять на строки встол.Я не хочу, чтобы это блокировалось пользователем, который оставляет открытым сеанс в одной из этих строк.

Единственный способ обойти это, чтобы не дать пользователям прямой доступ к таблице, а вместо этогосоздать обновляемое представление или функции PL / SQL, которые записывают во временную таблицу, а затем предоставить пользователю процедуру, которая выполняет фактические операции записи и фиксации.Таким образом, время, когда строки будут заблокированы, будет только во время выполнения «процедуры фиксации», которая будет ограничена.

Мне бы хотелось, чтобы решение было примерно таким, но желательно более простым.

...