Блокировка, обработка и снятие блокировки в jdbc - PullRequest
0 голосов
/ 12 сентября 2011

Это мое требование - заблокировать запись в базе данных, обработать ее и освободить

Окружающая среда - weblogic 10.3 База данных - Oracle 11g Источники данных - задействованы несколько источников XA Tx мгр - JTA

Вот результаты экспериментов, которые я провел до сих пор:

Эксперимент 1 - полагаться на чтение незафиксированным

  1. Прочитать запись в БД
  2. Блокировка записи по id в другой таблице, как часть глобальной транзакции JTA
  3. Обработка записи Вторая транзакция, которая попытается заблокировать ту же запись, потерпит неудачу, удалит запись. Но для того, чтобы это работало, СУБД должна разрешать грязное чтение. К сожалению, Oracle не поддерживает чтение уровня изоляции без фиксации.

Эксперимент 2 - Блокировка записи в локальной транзакции

  1. Прочитать запись в БД
  2. Блокировка записи по id в другой таблице как отдельной локальной транзакции
  3. Обработка записи и удаление записи при успешной фиксации транзакции Вторая транзакция, которая попытается заблокировать ту же запись, потерпит неудачу, удалит запись. Этот подход основан на подтвержденных данных, должен работать нормально. Проблема в том, что, поскольку транзакция блокировки и глобальный родительский объект различаются, если при обработке не удается выполнить откат основной транзакции, я должен компенсировать ее, откатив транзакцию блокировки, что я не знаю, как это сделать - Нужна помощь здесь

Если Iam не сможет откатить транзакцию блокировки записи, придется написать какую-то грязную логику вокруг кода блокировки записи. Я не предпочитаю это.

Это очень распространенное требование. Я хотел бы знать, как вы, ребята, справляетесь с этим элегантно. Поддерживает ли Oracle каким-либо образом сделать незафиксированные обновления видимыми для всех транзакций.

Заранее большое спасибо.

1 Ответ

1 голос
/ 12 сентября 2011

У нас есть служебный класс, который примерно реализует то, что вы описали в эксперименте 2:

Предварительное условие: наличие выделенной таблицы для блокировки

На этапе блокировки создается новое соединение;INSERT INTO выполняется в таблице блокировок.

На этапе разблокировки откат соединения выполняется независимо от выполнения бизнес-логики.

Используется как java.util.concurrent.locks.Lock:

Lock lock = new Lock(...);
lock.lock();
try {

    // your business logic
} finally {
   lock.unlock();
}

Работает на веб-сфере / оракуле.

Обратите внимание, что если вы используете JPA, есть встроенная поддержка блокировки сущностей.

...