У меня есть таблица, в которой столбцы имеют вид
Task_Track
- Номер TaskID (PK AutoGeneratedSequence)
- TaskCd Varchar2
- RefCd Varchar2
- RefID varchar2
- Params varchar2
- ... и т. Д.
Я работаю над сценарием, в котором я запускаю запрос на выборку для этой таблицыполучить набор результатов.
Выбрать * из Task_Track, где RefCd =?и RefID =?и TaskCd =?;
Если у меня нет результатов, я вставлю новую задачу со значениями RefCd RefID TaskCd Params.Params - это обычно person_id, связанный с задачей.Если я получу набор результатов, я добавлю новый параметр и обновлю набор результатов.
if (resultset! = Null и resultSet.length ()> 0)
update params logic
else
вставить новую логику задачи.
Работает, как и ожидалось, в последовательном запуске.Но когда у меня запущены 2 параллельные очереди, и я получаю одинаковые значения RefCd RefID TaskCd одновременно.Мой первый блок находит набор результатов и собирается выполнить логику обновления, как и ожидалось, но вторая очередь не может найти результат и входит в логику вставки.
Из того, что я понимаю, даже если первая очередьзаблокировала строку для обновления, вторая очередь не должна иметь проблем с чтением и должна завершиться ошибкой при обновлении из-за блокировки, если первая очередь не сняла блокировку.Но само мое чтение терпит неудачу, когда оно не выдает никакого исключения, а возвращает пустой набор результатов (длина = 0).Из-за чего он перемещается в логику вставки.
Возможно ли, что на чтение влияет обновление, происходящее параллельно?Если да, то как мне решить эту проблему?
Примечание. Я использую Oracle 11G и Java8 с Websphere 9
Спасибо