berezdetsky писал(а) 19. Ноября 2009 :: 10:11:Захар Малиновский писал(а) 19. Ноября 2009 :: 10:01:И собственные блокировки тут не суть дела. У вас (без изменённых блокировок) ведь тоже кто то что то может провести , удалить из таблицы взаиморасчётов, чтобы потом записать новые движения , пока ваш отчёт читает данные.
У меня блокировки как раз "изменённые".
И nolock почему-то совсем не мешает.. А holdlock в описанном сценарии - это путь не только к относительно правдоподобным данным, но и к взаимоблокировкам.
И опять я с вами не соглашусь.
Воспользовавшись намеренно неправильно монопольной блокировкой двух строк, можно попасть в деадлок с другим, таким же кодом , но с обратным порядком блокировки этих двух строк.
Это все знают.
_Но_ это же не повод запретить вообще использование различных блокировок.
Т.е. возможность указать хинт должна быть.
Возможность, а не обязанность.
Пусть программист принимает решение о том как блокировать.
И кстате, сделать деадлок отчёта по взаиморасчётам с документами меняющими таблицы взаиморасчётов ,по обычной схеме "удалил-добавил", невозможно.
Потому как первым делом в проведении документов делаеться delete взаиморасчёты where iddoc = ... , а это сразу даёт IХ-lock на таблицу взаиморасчётов, она с чтением не совместима. Соответственно этот момент либо ждёт завершения чтения нашим отчётом (отчёт не nolock конечно), либо наш отчёт ждёт окончания проведения , ведь наш отчёт не nolock.
Я чесно не понял как у вас с nolock чтение отчёта , например взаиморасчётов, ожидает конца проведения документа в другом подключении. Вы что то вроде по смыслу TABLOCK используете ? Ну вот конкретно, итоги по взаиморасчётам в режиме _по всем клиентам_ у вас чем блокируються ? Несколькими блокировками или одной ?