Я заметил, когда я делаю следующее:
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, которые записывают во временную таблицу, а затем предоставить пользователю процедуру, которая выполняет фактические операции записи и фиксации.Таким образом, время, когда строки будут заблокированы, будет только во время выполнения «процедуры фиксации», которая будет ограничена.
Мне бы хотелось, чтобы решение было примерно таким, но желательно более простым.