Нужна помощь для понимания поведения блокировки, наблюдаемого во время DELETE в DB2 в z/OS

Изучая поведение двух транзакций, запущенных из двух экземпляров DbVisualizer, указывающих на экземпляр базы данных DB2 в z/OS, я заметил следующее поведение при удалении записей из таблиц.

Предположим, у меня есть стол MYTABLE с первичным ключом MYID и предположим, что выполнение

select MYID from MYTABLE

дает что-то вроде (числа являются произвольными и записаны просто сделать вещи конкретными)

112
119
...
...
789
...

В пробе A я выполняю, начиная с первой транзакции (используя первый экземпляр DBVisualizer) и без фиксации,

DELETE FROM MYTABLE WHERE MYID=112

Затем я выполняю из второй транзакции (используя второй экземпляр DBVisualizer)

DELETE FROM MYTABLE WHERE MYID=119 

Это, однако, блокирует вторую транзакцию и через некоторое время выдает ошибку

UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. 
REASON CODE 00C9008E, TYPE OF RESOURCE 00000302, AND...

В подобном испытании, испытании B, когда я использую MYID s 112 а также 789 вместо (789 "не рядом" 112), вторая транзакция не блокируется. Поиск значения TYPE OF RESOURCE 00000302 На https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/db2z_resourcetypes.html можно найти "Страница табличного пространства" (ссылка для DB2 в z/OS),

Таким образом, похоже, что в пробной версии A первая DELETE "заблокировала" некоторую "страницу", к которой обе записи MYID112 а также 119 "принадлежал", и что эта блокировка заблокировала потом вторую транзакцию. В пробной версии B две записи принадлежат разным "страницам", а первая команда DELETE не блокирует вторую.

Взяв за основу хорошо известную книгу по DB2, я прочитал: "В зависимости от запрошенных операций менеджер баз данных может получить блокировки строк таблицы, блоков таблиц, таблиц, табличных пространств, буферных пулов и баз данных". Затем объясняется, что существуют различные "режимы блокировки".

Мой вопрос: относится ли "блокировка блоков таблицы" в приведенной выше цитате к наблюдаемой в пробе "блокировке страниц табличного пространства", или это какой-то другой тип блокировки, не упомянутый в цитате? И почему при всей блокировке используется "блокировка страницы табличного пространства", а не блокировка на уровне строк, которая, по-видимому, не приведет к блокировке второй транзакции во время испытания A? (Я читал об эскалации блокировок в DB2, но, насколько я знаю, в то время не было никаких транзакций, в которых участвовали MYTABLE)

Используемая версия DB2 - 10 в "режиме совместимости", что понижает его до уровня, аналогичного DB2 версии 8. Я думаю, что в противном случае конфигурация должна быть "по умолчанию" или "стандартной".

(Этот вопрос является результатом моих попыток понять проблему, описанную в предыдущем вопросе. Может ли один оператор delete, удаляющий несколько строк, вызвать взаимоблокировку?)

РЕДАКТИРОВАТЬ

Только что попробовал это на DB2 Express на моем ноутбуке Windows, и поведение, которое я вижу, отличается; блокировки - это блокировки строк, как я и ожидал (поэтому вторые блоки DELETE блокируются, только если я пытаюсь удалить ту же строку). Так это действительно о DB2 в z/OS? Или это старая версия DB2? Или, возможно, наблюдение намекает на какую-то особую конфигурацию DB2?

1 ответ

Решение

Я считаю, что по умолчанию для табличного пространства DB2 z/OS установлено LOCKSIZE ANYчто эффективно означает LOCKSIZE PAGEто есть вся страница табличного пространства блокируется, если обновляется какая-либо строка на этой странице. Ссылка на документацию. Это объясняет поведение, которое вы видите.

Выпустить (или попросить вашего администратора базы данных выдать) ALTER TABLESPACE ... LOCKSIZE ROW оператор для табличного пространства, в котором находится рассматриваемая таблица. Для DB2 в z / OS обычной практикой является использование одной таблицы на табличное пространство, поэтому это изменение не должно сильно влиять на другие рабочие нагрузки (если вам не удастся использовать всю блокирующую память в базе данных).

В DB2 для LUW возможны только блокировки на уровне строк и таблиц, что также объясняет разницу, которую вы видите с DB2 Express в Windows.

Другие вопросы по тегам