|
Конфликт блокировок при выполнении транзакции: | ☑ | ||
---|---|---|---|---|
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) режим блокировок конечно автоматический?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |