Как выполнить откат / тайм-аут блокировки "выбрать для обновления" в Oracle?
Наше приложение в основном использует оптимистическую блокировку, используя поддержку версий Hibernate. Мы планируем реализовать пессимистическую блокировку в одном конкретном сценарии. У меня нет большого опыта с пессимистической блокировкой, поэтому извините, если этот вопрос звучит наивно.
Когда пользователь показывает намерение обновить запись - мы блокируем соответствующую строку БД, используя "выбрать для обновления". Теперь, если этому пользователю требуется много времени для фиксации его изменений, они забывают об этом после блокировки, как мы можем разблокировать эту блокировку, используя некоторый механизм тайм-аута / отката? Так, чтобы строка не оставалась заблокированной в течение очень долгого времени и не позволяла всем другим пользователям редактировать ее.
Я сомневаюсь, что это будет обработано в используемом нами механизме транзакций Weblogic-JTA-Spring, где у нас уже есть тайм-аут транзакции 30 минут. (??)
Таким образом, должен ли этот откат обрабатываться непосредственно на уровне Oracle. Если да, то как? Посоветуйте, пожалуйста, лучший способ справиться с этим, чтобы такие замки не задерживались слишком долго.
2 ответа
Блокировки будут сняты только после завершения транзакции. Транзакция закончится либо когда явный commit
или же rollback
выдается в базу данных или когда сеанс базы данных завершается (что делает неявное rollback
). Если ваш средний уровень уже настроен на откат любых транзакций, которые открыты более 30 минут, этого будет достаточно для снятия блокировок.
Однако если у вас есть приложение Java, работающее на сервере приложений Weblogic, мне кажется необычным подходить пессимистическая блокировка. Во-первых, я предполагаю, что вы используете пул соединений на среднем уровне. Если это так, то одно соединение с базой данных из пула соединений должно поддерживаться средним уровнем на протяжении транзакции (в данном случае до 30 минут). Но если оставить один сеанс открытым конкретному сеансу базы данных в течение продолжительного периода времени, это отрицательно сказывается на использовании пула соединений. Обычно десятки, если не сотни сеансов приложений могут совместно использовать одно соединение из пула соединений - если вы собираетесь разрешить пессимистическую блокировку, вы теперь устанавливаете соотношение 1:1 между сеансами приложения и сеансами базы данных для этих сеансов.
Существует множество случаев, когда оптимистическая блокировка не может заменить пессимистическую блокировку. Тайм-аут блокировки обрабатывается в базе данных. Обратитесь к этой странице о том, как настроить его в Oracle
Можно ли изменить таймаут блокировки объекта по умолчанию Oracle?