|  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 | 
| Участник | 
			
			Как вариант могу предложить все учитываемые документы ставить в очередь и учет текущего док-та проводить только после учета предыдущих.
		 | 
|  |