Может ли один оператор удаления, который удаляет несколько строк, вызвать тупик?
Мы работаем с эффективной версией 8 DB2 (более или менее, поэтому без CUR_COMMIT) в z/OS.
В нашем (основанном на Java, хотя это не должно быть актуальным) приложении существует метод, который выполняется в транзакции и удаляет несколько записей из таблицы, скажем, MY_TABLE, на основе значения определенного столбца, который мы будем называть SPECIAL_COLUMN, выполняя заявление
DELETE FROM MY_TABLE WHERE SPECIAL_COLUMN=?
Помимо выполнения этого оператора, выполняются некоторые другие операторы SQL, которые я опускаю, потому что на данный момент я думаю, что они, возможно, не имеют отношения к описываемой мной проблеме.
При одновременном запуске метода мы иногда видим исключение
nested exception is com.ibm.db2.jcc.am.SqlException:
UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. REASON CODE 00C90088, TYPE OF RESOURCE 00000302, AND RESOURCE NAME ... SQLCODE=-913, SQLSTATE=57033, DRIVER=3.63.131
брошенный во время выполнения DELETE FROM MY_TABLE WHERE SPECIAL_COLUMN=? заявление. Согласно http://www.idug.org/p/fo/et/thread=20542 это, похоже, связано с блокировками, размещаемыми на "страницах".
Мои вопросы следующие:
Фактически, два оператора DELETE, выполняемые одновременно для одного и того же значения SPECIAL_COLUMN, которому соответствуют несколько строк, могут вызвать такую тупиковую ситуацию (сценарий, который я имею в виду, выглядит примерно так: первый оператор "ставит блокировку" на "1-й странице"). ", вторая инструкция" устанавливает блокировку "на"2-й странице ", а затем первая инструкция ожидает блокировку на"2-й странице ", в то время как вторая инструкция ожидает блокировку на" 1-й странице ". Или это установка таких блокировок означает "атомарный", что означает, что если первое утверждение начало ставить блокировки, второе будет ждать?
Тот же вопрос для разных значений SPECIAL_COLUMN (кажется более вероятным)
В случае, если такие сценарии возможны и могут быть причиной наблюдаемого тупика (в противном случае нам придется исследовать "unsuspicios" до сих пор SQL), что может быть разумным решением? (Я думал о синхронизации кода Java, но я думаю, что это не очень хорошая идея; я думал также о выдаче SELECT FOR UPDATE для строк, которые нужно удалить перед выполнением удаления, но так как будут задействованы дополнительные блокировки, я вполне сомневаюсь и в этом).
РЕДАКТИРОВАТЬ:
ссылка на отчет по аналогичной проблеме http://www.dbforums.com/showthread.php?575408-db2-OS390-TABLE-LOCK-DURING-DELETE