27.09.2005, 15:22 | #1 |
Участник
|
Две сессии намертво лочат друг друга, при этом клиенты повисают пока принудительно вручную не убивается одна из сессий.
Используется SQL Server 2k и LOCKTABLE(true,false). В чем может быть проблема? |
|
27.09.2005, 16:16 | #2 |
Участник
|
описан не дедлок. Когда действительно мертвая блокировка, SQL сам отрубает одну из транзакций, в результате чего пользователь получает сообщение типа "Ваше действие было заблокировано другим пользователем", в английской версии этого сообщения явно упоминается слово Deadlock.
Кто параметры к LOCKTABLE написал? попробуйте убрать пусть будет просто LOCKTABLE; |
|
27.09.2005, 16:28 | #3 |
Участник
|
Если это не деадлок, то что?
|
|
27.09.2005, 16:48 | #4 |
Участник
|
просто лок, не дед...
возможно, конечно, что у вас как-то время ожидания в SQL настроено так, что в ситуацию долго не вмешивается сервер. К сожалению, я плох в администрировании SQL, может кто ещё подскажет... |
|
27.09.2005, 17:39 | #5 |
Участник
|
Я тоже не силен в администрировании SQL Server.
Как можно узнать время ожидания сервера перед принудительным отключением клиентов для разрешения дедлока? В моем случае сервер не вмешивается в ситуацию на протяжении 15 минут, а дальше неизвестно, так как уже в ручную отключаются клиенты. |
|
28.09.2005, 10:05 | #6 |
Участник
|
Функциональность стандартная (какая?) или своя?
|
|
28.09.2005, 13:17 | #7 |
Участник
|
Функциональность - управление складом: стандартная и самописная (складской контроль).
И все-таки есть ли параметр, отвечающий за время, через которое сервер отключит один из блокируемых процессов автоматически? |
|
28.09.2005, 17:28 | #8 |
Участник
|
Кажется для SQL Servera
SET LOCK_TIMEOUT время в мили сек посмотри здесь http://rsdn.ru/article/db/mssqllocks.xml?print А вобще Microsoft советует дождатся 4.1 там многие проблемы связаные с SQL говорят будут решены |
|
28.09.2005, 18:12 | #9 |
Участник
|
Цитата:
Сообщение от DeSp
Функциональность - управление складом: стандартная и самописная (складской контроль).
И все-таки есть ли параметр, отвечающий за время, через которое сервер отключит один из блокируемых процессов автоматически? Performance Troubleshooting Guide for Microsoft® Business Solutions–Navision (есть на Tools CD) Microsoft Business Solutions–Navision SQL Server Option Resource Kit (есть на Tools CD 4.0) Там описаны рекомендации по программированию для избежания дедлоков и описание методики диагностики дедлоков. |
|
29.09.2005, 09:19 | #10 |
Участник
|
Да, спасибо за рекомендации, эти документы я уже читал и методикой воспользовался. Дедлоки обнаружены, они возникают при одновременном запуске одной операции разными клиентами. Порядок блокировок при этом должен быть одинаковый раз операция одна и та же, но выполнение приводит к дедлоку, непонятно почему.
|
|
29.09.2005, 09:53 | #11 |
Участник
|
Какая операция?
Вам удается дедлок воспроизвести? |
|
29.09.2005, 10:12 | #12 |
Участник
|
Да, дедлок удается воспроизвести.
Клиентами одновременно выполняется операция регистрации складского контроля. При этом возникают дедлоки по 3-м таблицам. |
|
29.09.2005, 11:27 | #13 |
Участник
|
Цитата:
Сообщение от DeSp
Две сессии намертво лочат друг друга,
маловероятно возникновение дедлока при параллельной работе одной и той же функции. Кода много в этом складском контроле? мож глянуть... Если неодновременно - функция быстро выполняется? |
|
29.09.2005, 12:35 | #14 |
Участник
|
Определяется это просто - клиенты висят по 15 минут, пока вручную не обрубается один из них.
Операции регистрации могут быть длительными, но в разумных пределах - это явно не десятки минут. Кода много. Если неодновременно, то выполняется относительно быстро. Я понимаю что это маловероятно, но это происходит слишком часто. |
|
29.09.2005, 12:49 | #15 |
Участник
|
Какие именно таблицы блокируются?
Возможно из-за различного порядка блокировки таблиц в содеюнитах учета складских документов и в 80,90 кодеюните? |
|
29.09.2005, 14:39 | #16 |
Участник
|
Таблицы:
Резервирование Операция Склад Операция Строка Склад Операция Заголовок Так как выполняется одна и та же операция, но разными клиентами, порядок блокировок таблиц должен быть одинаковым. |
|
29.09.2005, 15:39 | #17 |
Участник
|
Цитата:
Сообщение от DeSp
Таблицы:
Резервирование Операция Склад Операция Строка Склад Операция Заголовок Так как выполняется одна и та же операция, но разными клиентами, порядок блокировок таблиц должен быть одинаковым. |
|
29.09.2005, 15:55 | #18 |
Участник
|
Транзакция A заблокировала таблицу 1 и пытается прочитать данные из таблицы 2. Одновремено тразнакция B заблокировала таблицу 2 и пытается прочитать данные из таблицы 1. Здесь и возникает deadlock.
DeSp - и не факт что в разных участках кода порядок блокировок таблиц не может поменяться . Обратите внимание на commit в 5763 кодеюинте. |
|
30.09.2005, 13:32 | #19 |
Участник
|
Ничего другого, как тщательно перелопатить весь код видимо не остается. А кода реально много и писал его не я.
|
|
30.09.2005, 13:51 | #20 |
Участник
|
Как вариант могу предложить все учитываемые документы ставить в очередь и учет текущего док-та проводить только после учета предыдущих.
|
|