powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с дэдлоком
14 сообщений из 14, страница 1 из 1
Помогите с дэдлоком
    #36050218
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Подскажите плз сдедующее...

У меня есть хранимая процедура, которая делает следующее:

SET CURRENT ISOLATION = UR;
SEARCHABLE UPDATE данных в таблице Т1;
COMMIT;
MERGE данных в таблице Т1 (UPDATE и INSERT);
COMMIT;
SET CURRENT ISOLATION = RESET;

К таблице Т1 привязаны 2 триггера FOR EACH STATEMENT которые делают выборку из T1 и обновляют T2;

База версии 9.5 на AIX 64.

Эта хранимка вызывается из нескольких потоков, тоесть concurrently, при этом позникает взаимная блокировка при доступе к таблице Т1. Не могу понять почему.
Ход моих мыслей следующий:
1) Я устанавливаю уровень изоляции UR при входе в процедуру, следовательно, запрсы на выборку должны выполнять dirty read - тоесть не ждать пока запись в Т1 будет разлочена.
2)Первый UPDATE блокирует обновлённые записи эксклюзивно, но последующий COMMIT снимет эти блокировки.
3)MERGE делает то же самое - X блокировка изменённых и вставленных записей, потом COMMIT.
4)Триггеры наследуют уровень изоляции UR - тоесть не ждут чьих-то блокировок на Т1.

Как мне кажется, такая схема не должна приводить к дэдлокам, НО они есть.
Господа эксперты, подскажите где изьян в моих рассуждениях.
Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050313
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

1. У вас SQL хранимая процедура?
2. В процедуре эти запросы динамические или статические?
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050364
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Mark Barinstein

1) да
2) Статический.
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050412
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PowerEdgeЗдравствуйте, Mark Barinstein

1) да
2) Статический.

По поводу статического SQL. Небольшое уточнение во избежание путаницы.
Насколько я понимаю sql в хранимке типа

CREATE PROCEDURE dbo.do_work()
BEGIN
UPDATE T1 SET A=B WHERE A=1;
COMMIT;
END;

ясляется статическим?
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050438
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PowerEdge1) да
2) Статический.Тогда вам надо иметь ввиду следущее:
1.
Уровень изоляции по умолчанию (т.е. если явно в команде не указано) для статических sql в процедуре определяется при компиляции, и команды set isolation в процедуре не оказывают никагого действия на них.
Т.е. вы либо должны явно указывать уровень изоляции в команде, либо устанавливать уровень изоляции в окружении компиляции: перед 'create procedure' вызываете
db2 call sysproc.set_routine_opts('isolation ur')
2.
Вы, естественно, не разрулите дедлоки писателей уровнями изоляции.
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050475
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PowerEdgeПо поводу статического SQL. Небольшое уточнение во избежание путаницы.
Насколько я понимаю sql в хранимке типа

CREATE PROCEDURE dbo.do_work()
BEGIN
UPDATE T1 SET A=B WHERE A=1;
COMMIT;
END;

ясляется статическим?да.
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050490
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. если явно в команде не указано

1)Тоесть в UPDATE можно указать WITH UR - и это позволит выполнить его с dirty read, но при этом обновлённые записи всё-равно блокируются эксклюзивно. Затем блокировки снимаются COMMIT-ом. Верно?

2) Насколько я понимаю, для MERGE нечто подобное "WITH UR" указать нельзя? Тоесть, если хранимка скомпилирована с уровнем изоляции CS, то запрос, укзанный в после "USING" будет ждать разблокирования записей?

3) Если я скомпилирую данную процедуру с уровнем изоляции UR, будет ли этот эровень использоваться тригеррами, срабатываемими при работе хранимки?
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050526
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
2. Вы, естественно, не разрулите дедлоки писателей уровнями изоляции.

Я исхожу из того, что если процедура будет выполнять чтение в режиме dirty read, а изменения коммитить немедленно, то это поможет избежать взаимных блокировок (имеется в виду чтение и изменение данных в одной таблице при многопоточном выполнении процедуры).
Так ли это?
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050657
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PowerEdge1)Тоесть в UPDATE можно указать WITH UR - и это позволит выполнить его с dirty read, но при этом обновлённые записи всё-равно блокируются эксклюзивно. Затем блокировки снимаются COMMIT-ом. Верно?

2) Насколько я понимаю, для MERGE нечто подобное "WITH UR" указать нельзя? Тоесть, если хранимка скомпилирована с уровнем изоляции CS, то запрос, укзанный в после "USING" будет ждать разблокирования записей?

3) Если я скомпилирую данную процедуру с уровнем изоляции UR, будет ли этот эровень использоваться тригеррами, срабатываемими при работе хранимки?1. да
2. можно
3. да
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050680
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PowerEdgeЯ исхожу из того, что если процедура будет выполнять чтение в режиме dirty read, а изменения коммитить немедленно, то это поможет избежать взаимных блокировок (имеется в виду чтение и изменение данных в одной таблице при многопоточном выполнении процедуры).
Так ли это?"Немедленно" ничего не происходит.
Для избежания дедлоков обычно разрабатывается соответствующий дизайн транзакций.
Можете тут почитать, может, поможет:
Lock avoidance in DB2 UDB V8
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050749
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Марк, спасибо за советы.
Mark Barinstein"Немедленно" ничего не происходит.
В документации по COMMIT сказанно: "All locks acquired by the unit of work subsequent to its initiation are released, except necessary locks for open cursors that are declared WITH HOLD." Насколько я понимаю, не всё так просто? Можно, плс, ссылку где почитать подробнее?
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050805
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PowerEdge,

Про что почитать?
Я в том смысле про "немедленно" говорил, что в общем случае не надо думать о команде, что она блокировки на все требуемые ресурсы накладывает сразу.
Например, приложение 1 может выполнить update, который изменяет несколько строк. Он не делает это мгновенно и для всех строк стразу.
2-е приложение в это же самое время может успеть обновить строки, до которых ещё 1-ое приложение не добралось, а потом попытаться обновлять строки, которые 1-е уже обновило.
Т.е. вы вообще можете получить дедлок на 2-командах от разных приложений...
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050817
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, ясно, спасибо большое. Буду разбираться дальше.
...
Рейтинг: 0 / 0
Помогите с дэдлоком
    #36050846
PowerEdge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinPowerEdge,

Про что почитать?
Я в том смысле про "немедленно" говорил, что в общем случае не надо думать о команде, что она блокировки на все требуемые ресурсы накладывает сразу.
Например, приложение 1 может выполнить update, который изменяет несколько строк. Он не делает это мгновенно и для всех строк стразу.
2-е приложение в это же самое время может успеть обновить строки, до которых ещё 1-ое приложение не добралось, а потом попытаться обновлять строки, которые 1-е уже обновило.
Т.е. вы вообще можете получить дедлок на 2-командах от разных приложений...

А в данном случае, не поможет ли выполнение SELECT .. FOR UPDATE перед обновлением этих же записей? Или блокировка набора записей тоже осуществляется одна-за-одной и дэдлок тоже возможен?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с дэдлоком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]