Имя: Пароль:
1C
1С v8
Конфликт блокировок при выполнении транзакции:
,
0 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

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

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

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

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

И последнее: перейти на управляемые блокировки - это конечно хорошо, но я подозреваю, что потребуется n-ное количество еб#тни. Переделать запрос по моим советам и проверить - дело получаса. Это элементарно проще и быстрее.
34 xXeNoNx
 
13.06.18
22:11
(33) Виртуальные таблицы всегда должны использовать отборы, касаемо детализации по регистратору, то зачем использовать вирт. таблицу, если туфтологически детализация идет по регистратору, Карл!
"Переделать запрос по моим советам и проверить - дело получаса" - ну пусть переделает, проверит, а потом сделает как нужно... или нет...
35 Малыш Джон
 
13.06.18
22:14
(34) наверное имел в виду "тавтологически"?  Детализация идет до записи. Это не одно и то же, по регистратору может быть множество записей.
36 xXeNoNx
 
13.06.18
22:22
(35) "тавтологически" - в том числе и эту хрень.
"Детализация идет до записи. Это не одно и то же, по регистратору может быть множество записей" - и? Как оно поможет ТС? Как оно оптимизирует запрос, Если в индексы попадать не будем?
37 xXeNoNx
 
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
38 xXeNoNx
 
13.06.18
22:43
(37) * регистр оборотов = вирт. таблица оборотов
39 H A D G E H O G s
 
13.06.18
22:44
". Оно равнозначно условию "НЕ (ВидДвижения = Приход и Не Регистратор ссылка Док.КорректировкаПроформы и НЕ Регистратор ССЫЛКА Док.ДобавлениеКредитНоты)", которое работает побыстрее."

Позабавило.
40 rozer76
 
13.06.18
22:50
(0) режим блокировок конечно автоматический?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан