Как справиться с конфликтом блокировки строк на уровне приложения

У меня есть 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

Но, наконец, вы согласны со мной, мы не должны винить базу данных от блокировки двух транзакций от изменения одной и той же строки.

Другие вопросы по тегам