Транзакции не выполняются, так как таблица заблокирована в ORACLE - PullRequest
0 голосов
/ 10 июня 2019

У меня есть сценарий ниже в унаследованной кодовой базе - таблица 'Team' содержит информацию о Команде и счетчике.Он имеет столбец с именами 'TEAM_NAME' и 'COUNTER'.Ниже 3-х шаговая операция выполняется в транзакции -

  • Возьмите эксклюзивный LOCK для таблицы.
  • Считайте счетчик, соответствующий команде.
  • Использованиеэтот счетчик и увеличьте значение счетчика и сохраните его обратно в таблицу TEAM.

Как только эти шаги будут выполнены, завершите операцию.Из-за использования на первом этапе исключительной блокировки на столе другие параллельные транзакции завершаются неудачно.Я хочу выполнить это без потери транзакций в системе.Я действительно думаю, что если я удаляю оператор LOCK и у меня есть метод как Synchronized, он может работать, но у меня есть 4 JVM в реальном времени, и все же одновременная транзакция может поразить это.Пожалуйста, предложите лучший способ решения этой проблемы.

1 Ответ

0 голосов
/ 12 июня 2019

Вы почти никогда не должны делать руководство LOCK в Oracle. Если вы делаете это, вам, вероятно, следует переосмыслить то, что вы делаете. Что вы, вероятно, должны делать:

  1. Сделайте SELECT ... FOR UPDATE на своем столе, соответствующем команде. Это заблокирует только эту строку, а не всю таблицу. Параллельные сессии, работающие в разных командах, будут бесплатными.
  2. Делай все, что тебе нужно.
  3. Запустите UPDATE ..., чтобы обновить счетчик.

Еще более простой способ был бы:

  1. Do UPDATE ... RETURNING my_counter INTO ..., который вернет обновленное значение счетчика.
  2. Делайте то, что вам нужно, помните, что у вас есть увеличенное значение счетчика.
...