многопоточность и deadlock в mssql2000
От: lumf  
Дата: 03.05.06 16:07
Оценка:
тема достаточно избитая, но все же...

имеется куча потоков, которая вызывает одну и туже хранимку, которая там что-то сложное делает с базой.

вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?

вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?

вопрос 3: как наилучшим образом бороться, чтобы не растерять алюсы многопоточности? у меня два выхода: 1- блокировать mutex'om момент вызова процедуры; 2-ловить вот это


Transaction (Process ID 140) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

и делать то что говорится, то бишь Rerun the transaction


18.05.06 17:51: Перенесено модератором из '.NET' — AndrewVK
Сиськи и процессоры
Re: многопоточность и deadlock в mssql2000
От: _d_m_  
Дата: 03.05.06 20:31
Оценка: +1
Здравствуйте, lumf, Вы писали:

L>тема достаточно избитая, но все же...


L>имеется куча потоков, которая вызывает одну и туже хранимку, которая там что-то сложное делает с базой.


L>вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?


L>вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?


L>вопрос 3: как наилучшим образом бороться, чтобы не растерять алюсы многопоточности? у меня два выхода: 1- блокировать mutex'om момент вызова процедуры; 2-ловить вот это


В форум БД, пользоваться поиском, искать статью на RSDN по взаимоблокировкам
Re: многопоточность и deadlock в mssql2000
От: Аноним  
Дата: 03.05.06 21:10
Оценка: +1
Блокировать надо таблицы. Притом в правильном порядке, едином для всех операций. Тогда dead-lock-ов не будет (почти).

Когда пишешь многопользовотельское приложение, нужно ОЧЕНЬ хорошо планировать. Когда многопоточное — планировать ЕЩЕ больше.

На коленке многопользовательские приложения не собираются и "по книжке" не пишутся.

The speed of processors doubles every 18 months" -- Moore's law
"The speed of software halves every 18 months" -- Gates' law .


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: многопоточность и deadlock в mssql2000
От: SergPas Украина  
Дата: 04.05.06 10:19
Оценка:
Здравствуйте, lumf, Вы писали:

L>тема достаточно избитая, но все же...


L>имеется куча потоков, которая вызывает одну и туже хранимку, которая там что-то сложное делает с базой.


L>вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?


L>вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?


L>вопрос 3: как наилучшим образом бороться, чтобы не растерять алюсы многопоточности? у меня два выхода: 1- блокировать mutex'om момент вызова процедуры; 2-ловить вот это



L>
L>Transaction (Process ID 140) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
L>

L>и делать то что говорится, то бишь Rerun the transaction

Mutex не поможет если будет запущено несколько приложений, мы устанавливали режим блокировки строки вместо блокировки страницы это уменьшило вероятность deadlocks, а в остальном — в приложении обрабатывали ситуацию и повторяли запрос, вроде работало.
Re: многопоточность и deadlock в mssql2000
От: DemAS http://demas.me
Дата: 04.05.06 10:21
Оценка:
Здравствуйте, lumf, Вы писали:

L>вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?


нет

L>вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?


нет
... << RSDN@Home 1.2.0 alpha rev. 643>>
Re[2]: многопоточность и deadlock в mssql2000
От: DemAS http://demas.me
Дата: 04.05.06 10:23
Оценка: +1
Здравствуйте, BlackTigerAP, Вы писали:

BTA>Блокировать надо таблицы.


Прям так сразу всю таблицу? Да еще и в многопользовательском приложении?
... << RSDN@Home 1.2.0 alpha rev. 643>>
Re[2]: многопоточность и deadlock в mssql2000
От: SergPas Украина  
Дата: 04.05.06 10:25
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Здравствуйте, lumf, Вы писали:


L>>вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?


DAS> нет


L>>вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?


DAS> нет


IMXO — все с точностью наоборот.
Re[3]: многопоточность и deadlock в mssql2000
От: DemAS http://demas.me
Дата: 04.05.06 10:27
Оценка:
Здравствуйте, SergPas, Вы писали:

SP>Здравствуйте, DemAS, Вы писали:


DAS>>Здравствуйте, lumf, Вы писали:


L>>>вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?


DAS>> нет


L>>>вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?


DAS>> нет


SP>IMXO — все с точностью наоборот.


Опиши, как ты это видишь?
... << RSDN@Home 1.2.0 alpha rev. 643>>
Re[4]: многопоточность и deadlock в mssql2000
От: SergPas Украина  
Дата: 04.05.06 10:38
Оценка:
Здравствуйте, DemAS, Вы писали:
L>>>>вопрос 1: если бы в хранимке была лишь одна инструкция insert возник бы dead lock?

DAS>>> нет


L>>>>вопрос 2: если бы в хранимке была лишь одна инструкция update(причем каждый поток апдейтит уникальную запись) возник бы dead lock?


DAS>>> нет


SP>>IMXO — все с точностью наоборот.


DAS> Опиши, как ты это видишь?


dedlock — это не проблема (нормальная ситуация MSSQL-сервера), тем более не проблема приложения.
Не важно сколько DML-запросов выполняется, если изменяемые данные(ключи, индексы ...)
приходятся на заблокированную страницу (обычно 4K) возникает блокировка — это нормально,
проще провторить запрос и не беспокоиться. Можно бороться другими способами, но IMXO это
только усложнит задачу и снизит производительность.
Re[5]: многопоточность и deadlock в mssql2000
От: DemAS http://demas.me
Дата: 04.05.06 10:46
Оценка:
Здравствуйте, SergPas, Вы писали:


SP>dedlock — это не проблема (нормальная ситуация MSSQL-сервера)


Блокировка — это не проблема. Deadlock — повод задуматься и сделать так, чтобы не было.

Блокировка, это когда 2 конкурирующих процесса борются за одни ресурсы и при этом процесс 1 ожидает пока процесс 2 освободит ресурс, а 2-ой процесс ожидает 1-ый.

Допустим у нас есть два ресурса А и Б, и два процесса 1 и 2.

1) Процесс 1 блокирует ресурс А
2) Процесс 2 блокирует ресурс Б
3) Процесс 1 хочет заблокировать ресурс Б, но не может и ожидает процесс 2
4) Процесс 2 хочет заблокировать ресурс А, но не может и ожидает процесс 1

Классическая взаимоблокировка.

Как вообще может возникнуть deadlock при работе с одним (и только одним) ресурсом ?
... << RSDN@Home 1.2.0 alpha rev. 643>>
Re[6]: многопоточность и deadlock в mssql2000
От: DemAS http://demas.me
Дата: 04.05.06 11:08
Оценка:
Здравствуйте, DemAS, Вы писали:

Прошу прощения, читать конечно надо так:

DAS> ВзаимоБлокировка, это когда 2 конкурирующих процесса борются за одни ресурсы и при этом процесс 1 ожидает пока процесс 2 освободит ресурс, а 2-ой процесс ожидает 1-ый.
... << RSDN@Home 1.2.0 alpha rev. 643>>
Re[6]: многопоточность и deadlock в mssql2000
От: SergPas Украина  
Дата: 04.05.06 11:14
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Здравствуйте, SergPas, Вы писали:


DAS> Допустим у нас есть два ресурса А и Б, и два процесса 1 и 2.

DAS> 1) Процесс 1 блокирует ресурс А
DAS> 2) Процесс 2 блокирует ресурс Б
DAS> 3) Процесс 1 хочет заблокировать ресурс Б, но не может и ожидает процесс 2
DAS> 4) Процесс 2 хочет заблокировать ресурс А, но не может и ожидает процесс 1

DAS> Классическая взаимоблокировка.


DAS> Как вообще может возникнуть deadlock при работе с одним (и только одним) ресурсом ?


Со всем согласен, блокировка возможна — взаимоблокировка нет.
Но в конкретном случае сложно заранее определить из-за какого ресурса возникает "проблема".
У MSSQL при возникновении блокировки (не deadlock) запрос становиться в ожидание в специальную
очередь (размер которой настраивается параметрами сервера), при переполнении очереди происходит эскалация
блокировки со строки до страницы и так до таблицы в целом. После чего вероятность deadlock возрастает.
При возникновении deadlock MSSQL выдергивает запрос из очереди и сообщает об этом приложению и так до тех пор пока
не разрулится ситуация.
Давно это было, я уже всех тонкостей не помню, перешли на Oracle там таких проблем нет.
А за подробностями лучше обратиться на www.sql.ru — там все гораздо подробнее.
Re[2]: многопоточность и deadlock в mssql2000
От: Аноним  
Дата: 04.05.06 11:27
Оценка: -1
DemAS>> Прям так сразу всю таблицу? Да еще и в многопользовательском приложении?

Не надо меня прямо так буквально понимать. Ну не всю таблицу, а необходимый кусок. Хотя иногда надо бы и всю таблицу. Зависит от характера изменений.

The speed of processors doubles every 18 months" -- Moore's law
"The speed of software halves every 18 months" -- Gates' law .


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[7]: многопоточность и deadlock в mssql2000
От: DemAS http://demas.me
Дата: 04.05.06 11:38
Оценка:
Здравствуйте, SergPas, Вы писали:

SP>Со всем согласен, блокировка возможна — взаимоблокировка нет.


Ага. А в исходном сообщении, человек как раз и спрашивал про взаимоблокировку, поэтому я и ответил "нет".

SP>У MSSQL при возникновении блокировки (не deadlock) запрос становиться в ожидание в специальную

SP>очередь (размер которой настраивается параметрами сервера), при переполнении очереди происходит эскалация
SP>блокировки со строки до страницы и так до таблицы в целом.

Насколько я помню, тут нет никакой очереди. Если менеджеру блокировки для хранения информации о наложенных блокировках требуется более 40% памяти, то он пытается эскалировать блокировки. В случае, если другие строки таблицы заблокированы другим процессом — эскалация не происходит.

SP>После чего вероятность deadlock возрастает.


Да за счет чего она увеличивается то? Мы по прежнему имеем один ресурс — на этот раз таблицу, за которую происходит борьба. Откуда возьмется deadlock ?

SP>При возникновении deadlock MSSQL выдергивает запрос из очереди и сообщает об этом приложению и так до тех пор пока

SP>не разрулится ситуация.

При возникновении deadlock сервер стоит граф блокировок и выбирает один из процессов, как кандидат на rollback. После чего второй процесс продолжает свое выполнение.

SP>Давно это было, я уже всех тонкостей не помню, перешли на Oracle там таких проблем нет.


Там есть другие проблемы
... << RSDN@Home 1.2.0 alpha rev. 643>>
Re[8]: многопоточность и deadlock в mssql2000
От: SergPas Украина  
Дата: 04.05.06 12:02
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS> Насколько я помню, тут нет никакой очереди. Если менеджеру блокировки для хранения информации о наложенных блокировках требуется более 40% памяти, то он пытается эскалировать блокировки. В случае, если другие строки таблицы заблокированы другим процессом — эскалация не происходит.


Я имел дело с MSSQL6.5 не знал что все изменилось.

SP>>После чего вероятность deadlock возрастает.


DAS> Да за счет чего она увеличивается то? Мы по прежнему имеем один ресурс — на этот раз таблицу, за которую происходит борьба. Откуда возьмется deadlock ?


Дык, с этой таблицей (другими записями) можер работать кто угодно другой.

SP>>Давно это было, я уже всех тонкостей не помню, перешли на Oracle там таких проблем нет.


DAS> Там есть другие проблемы

Это точно, особенно для разработки клиентских приложений.
Re[2]: многопоточность и deadlock в mssql2000
От: _d_m_  
Дата: 05.05.06 10:14
Оценка:
Здравствуйте, BlackTigerAP, Вы писали:

BTA>Блокировать надо таблицы. Притом в правильном порядке, едином для всех операций. Тогда dead-lock-ов не будет (почти).


Ну что-ж... И тебе рекомендую почитать статейку по взимоблокировкам.

BTA>Когда пишешь многопользовотельское приложение, нужно ОЧЕНЬ хорошо планировать. Когда многопоточное — планировать ЕЩЕ больше.


BTA>На коленке многопользовательские приложения не собираются и "по книжке" не пишутся.


Вроде трудно не согласиться, но после "блокировать таблицы" как-то выглядит не очень.
Re[3]: многопоточность и deadlock в mssql2000
От: _d_m_  
Дата: 05.05.06 10:25
Оценка:
Здравствуйте, BlackTigerAP, Вы писали:

DemAS>>> Прям так сразу всю таблицу? Да еще и в многопользовательском приложении?


BTA>Не надо меня прямо так буквально понимать. Ну не всю таблицу, а необходимый кусок. Хотя иногда надо бы и всю таблицу. Зависит от характера изменений.


Не понимаешь ты механизм блокировок MS SQL, а советы даешь. Сколько пишу на MS SQL, ну вот НИ РАЗУ не потребовалось ставить хинт tablock или tablockx. Уровень изоляции транзакций до serializable в нескольких (менее 5) запросах — есть хинты. Вот таким образом и надо работать с блокировками.
Re[5]: многопоточность и deadlock в mssql2000
От: _d_m_  
Дата: 05.05.06 10:29
Оценка:
Здравствуйте, SergPas, Вы писали:


SP>dedlock — это не проблема (нормальная ситуация MSSQL-сервера), тем более не проблема приложения.


Что-то путаешь: блокировку и взимоблокировку.

SP>Не важно сколько DML-запросов выполняется, если изменяемые данные(ключи, индексы ...)

SP>приходятся на заблокированную страницу (обычно 4K) возникает блокировка — это нормально,

Ну вобще-то 8К

SP>проще провторить запрос и не беспокоиться. Можно бороться другими способами, но IMXO это

SP>только усложнит задачу и снизит производительность.

2all: Еще раз: читать статью, а потом с умным видом давать советы
Re[9]: многопоточность и deadlock в mssql2000
От: _d_m_  
Дата: 05.05.06 10:32
Оценка:
Здравствуйте, SergPas, Вы писали:

SP>Здравствуйте, DemAS, Вы писали:


DAS>> Насколько я помню, тут нет никакой очереди. Если менеджеру блокировки для хранения информации о наложенных блокировках требуется более 40% памяти, то он пытается эскалировать блокировки. В случае, если другие строки таблицы заблокированы другим процессом — эскалация не происходит.


SP>Я имел дело с MSSQL6.5 не знал что все изменилось.


Открою секрет: Windows XP все-таки отличается от Windows 3.1. Впрочем как и MS SQL 2005 отличается от MS SQL 6.5
Re[4]: многопоточность и deadlock в mssql2000
От: hugo Австрия  
Дата: 05.05.06 10:49
Оценка: -1
Здравствуйте, _d_m_, Вы писали:

___>Уровень изоляции транзакций до serializable в нескольких (менее 5) запросах — есть хинты. Вот таким образом и надо работать с блокировками.


И при этом все стоят и нервно курят, пока один человек выполнит свой запрос? А если они только почитать чего-нить хотят, причем совсем не из тех таблиц, которые изменяет работающая в данный момент транзакция?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.