Как справиться с конфликтом блокировки строк на уровне приложения
У меня есть 2 приложения (Spring - Hibernate с загрузкой), использующих одну и ту же базу данных Oracle (11g). Оба приложения последовательно попадают в определенную таблицу, и за ней приходится огромное количество обращений. мы можем видеть исключения конфликтов блокировки строк в журналах БД, и приложения должны перезапускаться каждый раз, когда мы получаем их, или когда это создает тупиковую ситуацию.
мы используем JPA entitymanager для этих приложений. нужна помощь по этому вопросу
1 ответ
По этой ссылке: http://www.dba-oracle.com/t_enq_tx_row_lock_contention.htm
Эта ошибка возникает из-за того, что транзакция ожидает подтверждения или отката другой транзакции... Это поведение корректно для POV базы данных, и если вы думаете о согласованности данных..... Но если для вас важна доступность / выполнение... Возможно, вам придется поработать, в том числе:
1 создайте отдельные таблицы для каждого приложения, затем обновите основную таблицу с данными в автономном режиме (но вы пожертвуете согласованностью данных)
2 создать отдельный поток для регистрации и повторения неудачных транзакций
3 несут проблему доступности (задержки), если согласованность является большой проблемой
Также есть несколько общих советов для рассмотрения:
Сделайте транзакцию минимальной... Подумайте о каждом процессе, включенном в транзакцию. Если это обязательно или может быть удалено за пределы
2 настройка разграничения транзакций... Вы могли бы долго находить транзакцию открытой без причины, кроме плохого кодирования
3 не выполнять операции чтения внутри транзакций
4 по возможности избегайте расширенного контекста постоянства (без сохранения состояния)
5 вы можете использовать не JTA транзакционный источник данных для отчетов и чтения запросов
6 проверьте типы блокировок, которые вы используете, и постарайтесь избежать - в соответствии с вашим делом - любой вещи, кроме OPTIMISTIC
Но, наконец, вы согласны со мной, мы не должны винить базу данных от блокировки двух транзакций от изменения одной и той же строки.