Это мое требование - заблокировать запись в базе данных, обработать ее и освободить
Окружающая среда - weblogic 10.3
База данных - Oracle 11g
Источники данных - задействованы несколько источников XA
Tx мгр - JTA
Вот результаты экспериментов, которые я провел до сих пор:
Эксперимент 1 - полагаться на чтение незафиксированным
- Прочитать запись в БД
- Блокировка записи по id в другой таблице, как часть глобальной транзакции JTA
- Обработка записи
Вторая транзакция, которая попытается заблокировать ту же запись, потерпит неудачу, удалит запись.
Но для того, чтобы это работало, СУБД должна разрешать грязное чтение.
К сожалению, Oracle не поддерживает чтение уровня изоляции без фиксации.
Эксперимент 2 - Блокировка записи в локальной транзакции
- Прочитать запись в БД
- Блокировка записи по id в другой таблице как отдельной локальной транзакции
- Обработка записи и удаление записи при успешной фиксации транзакции
Вторая транзакция, которая попытается заблокировать ту же запись, потерпит неудачу, удалит запись. Этот подход основан на подтвержденных данных, должен работать нормально.
Проблема в том, что, поскольку транзакция блокировки и глобальный родительский объект различаются, если при обработке не удается выполнить откат основной транзакции, я должен компенсировать ее, откатив транзакцию блокировки, что я не знаю, как это сделать - Нужна помощь здесь
Если Iam не сможет откатить транзакцию блокировки записи, придется написать какую-то грязную логику вокруг кода блокировки записи. Я не предпочитаю это.
Это очень распространенное требование. Я хотел бы знать, как вы, ребята, справляетесь с этим элегантно.
Поддерживает ли Oracle каким-либо образом сделать незафиксированные обновления видимыми для всех транзакций.
Заранее большое спасибо.