Вход | Регистрация


1С:Предприятие ::

Метки: 

Конфликт блокировок при выполнении транзакции:

Я
   Alex_Kh_ua
 
13.06.18 - 16:30
Добрый день дорогие форумчане, есть беда, без Вашей помощи никак...

по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'

Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 11.0: Lock request time out period exceeded.  

Ошибка возникает в момент выполнения и выгрузки запроса, и не совсем понятно почему, так как в запросе явно указано, Блокировать получаемые данные для последующего изменения. Даже не знаю в какую сторону смотреть.

Сам запрос обращается к некому регистру накоплений. http://prntscr.com/juhh8l

Совершенно еще не селен в блокировках, может кто поделится дельным советом, куда можно копнуть?
 
 
   lodger
 
1 - 13.06.18 - 16:33
(0) выбор когда тогда иначе ЛОЖЬ конец.
   Alex_Kh_ua
 
2 - 13.06.18 - 16:34
И что этой частью не так?
   lodger
 
3 - 13.06.18 - 16:38
(2) "иначе ЛОЖЬ" допиши в секции ГДЕ.
   hhhh
 
4 - 13.06.18 - 16:39
(2) ИНАЧЕ не расписал. Что делать если ИНАЧЕ
   Fragster
 
5 - 13.06.18 - 16:40
(1)(4) ну так там иначе NULL -> ложь
   Fragster
 
6 - 13.06.18 - 16:40
но есть мнение, что тут как-то сделана структура регистров, получать осаток путем анализа всего регистра как-то не очень хорошо
   hhhh
 
8 - 13.06.18 - 16:41
(2) и что записываешь? Документ?

лучше укажи ДЛЯ ИЗМЕНЕНИЯ Регистр такой-то. А то ты там полбазы блокируешь для изменения.
   Alex_Kh_ua
 
9 - 13.06.18 - 16:42
как (2) влияет на конфликт блокировок?
   Bober
 
10 - 13.06.18 - 16:42
(0)
1. установлен индекс на свойстве регистра Проформа? Если нет - поставить.
2. ДЛя ИЗМЕНЕНИЯ <указать таблицу>.
 
  Рекламное место пустует
   Bober
 
11 - 13.06.18 - 16:46
(8) в запросе нет явного или неявного использования других таблиц.
   Tateossian
 
12 - 13.06.18 - 16:48
(0) Для изменения работает только в блоке инструкции НачатьТранзакцию() Зафиксирвоать транзакцию(). Смотрите, где есть в транзакции еще какие запросы к этому регистру. Возможно,транзакция очень большая и блокирующие запросы других сеансов пытаются конкурировать.
   hhhh
 
13 - 13.06.18 - 16:49
(11) есть. Регистратор. До такой степени явное, что явнее не придумаешь.
   Tateossian
 
14 - 13.06.18 - 16:50
(8) Нет, блокируются только то, что есть в операторе ИЗ.
   Bober
 
15 - 13.06.18 - 16:50
(0) если таблица регистра большая и массово используется, то при таком запросе скорее всего будет полное сканирование таблицы. В этом случае и могут возникать ожидания на блокировку. Тем более если база 1с на автоматических блокировках.
   Alex_Kh_ua
 
16 - 13.06.18 - 16:54
(15) Как это можно обойти?
   hhhh
 
17 - 13.06.18 - 16:56
(16) пиши в ДЛЯ ИЗМЕНЕНИЯ только ту таблицу, которую действительно собираешься изменять
   Bober
 
18 - 13.06.18 - 17:05
(16)
- поле регистра Проформа это измерение или реквизит?
- у поля Проформа включено индексирование?
   Alex_Kh_ua
 
19 - 13.06.18 - 17:14
(18) - поле регистра Проформа это измерение или реквизит? Измерение.
   Alex_Kh_ua
 
20 - 13.06.18 - 17:14
(18) - у поля Проформа включено индексирование? нет, не включено
   очко
 
21 - 13.06.18 - 17:22
(0) а почему ты решил что именно этот запрос вызывает конфликт блокировок? Настраивай xevents на bpr (не забудь поставить Blocked Process Threshold) и смотри в bpr какой запрос вызывает блокировку и кто его ждет. По названиям таблиц поймешь какой это запрос из 1С и чего он делает.
   Tateossian
 
22 - 13.06.18 - 17:34
(21) Он видимо решил что валится на нем, значит его и нужно оптимизировать. Совсем не слушает меня в (12).
   Alex_Kh_ua
 
23 - 13.06.18 - 18:03
(21) не удалось найти внятную информацию о EXTENDED events на bpr (не забудь поставить Blocked Process Threshold), поделитесь пожалуйста информацией о реализации данного метода :)
   очко
 
24 - 13.06.18 - 18:06
   Alex_Kh_ua
 
25 - 13.06.18 - 18:06
А кто может подсказать, насколько рабочий вот этот метод http://www.gilev.ru/timeoutlock/?
   Bober
 
26 - 13.06.18 - 18:23
(20) включить индексирование.
   lodger
 
27 - 13.06.18 - 18:36
(25) исправь (1), потом читай (12) до просвещения.
у гилева тулза для конфиг которые работают, а не падают на самолоке.
   xXeNoNx
 
28 - 13.06.18 - 19:18
(0) 1. Перейти на управляемые блокировки
2. Убрать из секции запроса ГДЕ - ВЫБОР и прочую хренотень, используй вместо этого ОБЪЕДИНИТЬ ВСЕ
   Малыш Джон
 
29 - 13.06.18 - 20:55
(0) 1. Это регистр накопления. Почему нельзя взять обороты с детализацией по регистратору и поставить хотя бы часть отборов в условиях виртуальной таблицы?
2. условие "вид движения = расход или выбор блаблабла" достаточно медленное. Оно равнозначно условию "НЕ (ВидДвижения = Приход и Не Регистратор ссылка Док.КорректировкаПроформы и НЕ Регистратор ССЫЛКА Док.ДобавлениеКредитНоты)", которое работает побыстрее. Дискретная математика рулит.
   xXeNoNx
 
30 - 13.06.18 - 21:48
(29) "Почему нельзя взять обороты с детализацией по регистратору" - Запусти консоль с планом запроса и увидишь почему. И чем оно лучше выборки из физической таблицы в данном случае?

"...Док.КорректировкаПроформы и НЕ Регистратор ССЫЛКА Док.ДобавлениеКредитНоты)", которое работает побыстрее" - и почему же оно будет работать "побыстрее"?
   Малыш Джон
 
31 - 13.06.18 - 21:50
(30) "посмотри сам и увидишь" - это классный ответ)
   xXeNoNx
 
32 - 13.06.18 - 21:53
+ (29) КАК НЕ в запросе оптимизирует сам запрос?
"Не Регистратор ссылка Док.КорректировкаПроформы"
Аналогично ТипЗначения(Регистратор) <> ТИП(Док.КорректировкаПроформы), а знаешь что бывает за ">, <, <>" в запросе?
   Малыш Джон
 
33 - 13.06.18 - 22:04
(32) вот вообще не сдалось что-то тебе доказывать. Была уже здесь тема, что это не одно и то же. И условие в данном случае оптимизироваться так как ты написал, не будет.

По поводу аналогичности простой выборки и оборотов - тоже нет, не одно и то же. Здесь могу тебе посоветовать воспользоваться твоим же советом - попробуй сам и сравни. Просто выборку с условием "ГДЕ Сделка=&Сделка" и "Обороты(,,Регистратор,Сделка=&Сделка)".

И последнее: перейти на управляемые блокировки - это конечно хорошо, но я подозреваю, что потребуется n-ное количество еб#тни. Переделать запрос по моим советам и проверить - дело получаса. Это элементарно проще и быстрее.
 
 
   xXeNoNx
 
34 - 13.06.18 - 22:11
(33) Виртуальные таблицы всегда должны использовать отборы, касаемо детализации по регистратору, то зачем использовать вирт. таблицу, если туфтологически детализация идет по регистратору, Карл!
"Переделать запрос по моим советам и проверить - дело получаса" - ну пусть переделает, проверит, а потом сделает как нужно... или нет...
   Малыш Джон
 
35 - 13.06.18 - 22:14
(34) наверное имел в виду "тавтологически"?  Детализация идет до записи. Это не одно и то же, по регистратору может быть множество записей.
   xXeNoNx
 
36 - 13.06.18 - 22:22
(35) "тавтологически" - в том числе и эту хрень.
"Детализация идет до записи. Это не одно и то же, по регистратору может быть множество записей" - и? Как оно поможет ТС? Как оно оптимизирует запрос, Если в индексы попадать не будем?
   xXeNoNx
 
37 - 13.06.18 - 22:42
(35) вдогонку на поразмыслить во что превращается регистр оборотов с детализацией по регистратору:
SELECT TOP 10
T1.RecorderTRef,
T1.RecorderRRef
FROM (SELECT
T2.Период AS Period_,
T2.Регистратор AS RecorderTRef,
T2.Регистратор AS RecorderRRef,
ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN T2.Сумма ELSE 0.0 END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0) AS Fld4793Receipt_,
ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN 0.0 ELSE T2.Сумма END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0) AS Fld4793Expense_,
ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN T2.КОплате ELSE 0.0 END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0) AS Fld4794Receipt_,
ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN 0.0 ELSE T2.КОплате END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0) AS Fld4794Expense_,
ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN T2.КОтгрузке ELSE 0.0 END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0) AS Fld4795Receipt_,
ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN 0.0 ELSE T2.КОтгрузке END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0) AS Fld4795Expense_
FROM РегистрНакопления.РасчетыСКлиентами T2
WHERE T2.Активность = 0x01
GROUP BY T2.Период,
T2.Регистратор,
T2.Регистратор
HAVING (ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN T2.Сумма ELSE 0.0 END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0)) <> 0.0 OR (ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN 0.0 ELSE T2.Сумма END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0)) <> 0.0 OR (ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN T2.КОплате ELSE 0.0 END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0)) <> 0.0 OR (ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN 0.0 ELSE T2.КОплате END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0)) <> 0.0 OR (ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN T2.КОтгрузке ELSE 0.0 END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0)) <> 0.0 OR (ISNULL(CAST(CAST(SUM(CASE WHEN T2.ВидДвижения = 0.0 THEN 0.0 ELSE T2.КОтгрузке END) AS NUMERIC(21, 2)) AS NUMERIC(21, 2)),0.0)) <> 0.0) T1
   xXeNoNx
 
38 - 13.06.18 - 22:43
(37) * регистр оборотов = вирт. таблица оборотов
   H A D G E H O G s
 
39 - 13.06.18 - 22:44
". Оно равнозначно условию "НЕ (ВидДвижения = Приход и Не Регистратор ссылка Док.КорректировкаПроформы и НЕ Регистратор ССЫЛКА Док.ДобавлениеКредитНоты)", которое работает побыстрее."

Позабавило.
   rozer76
 
40 - 13.06.18 - 22:50
(0) режим блокировок конечно автоматический?



Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует