Выберите Не возвращать результаты, когда оператор Update выполняется в той же строке? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть таблица, в которой столбцы имеют вид

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

Спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Вам нужно кешировать resultSet, прежде чем делать еще один запрос.Попробуйте это:

CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
crs.populate(myResultSet);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...