![]() |
|
Проблема взаимоблокировки (ТЖ) | ☑ | ||
---|---|---|---|---|
0
user4fun
24.07.18
✎
08:24
|
Всем здравствуйте!Есть регламентное задание Обмена между ЦБ и РИБ которое иногда зависает и ТЖ выдает вот эту ошибку. Как можно избежать таких ошибок? Всем в заранее спасибо!
10:12.387002-0,EXCP,6,process=rphost,p:processName=Base1C,t:clientID=232,t:applicationName=1CV8,t:computerName=User,t:connectID=130,SessionID=17,Usr=User,dbpid=60,Exception=DataBaseException,Descr='Конфликт блокировок при выполнении транзакции: Microsoft SQL Server Native Client 11.0: Транзакция (идентификатор процесса 60) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно. HRESULT=80004005, SQLSrvr: SQLSTATE=40001, state=33, Severity=D, native=1205, line=1 ' 10:12.387049-0,Context,3,process=rphost,p:processName=Base1C ,t:clientID=232,t:applicationName=1CV8,t:computerName=User,t:connectID=130,SessionID=17,Usr=User,Context=' Документ.ПоступлениеТоваров.Форма.ФормаДокумента.Форма : 328 : ТоварыПриИзмененииНоменклатуры(СтрокаТабличнойЧасти); Документ.ПоступлениеТоваров.Форма.ФормаДокумента.Форма : 262 : ХарактеристикаНоменклатурыОбъект.Записать();' |
|||
1
H A D G E H O G s
24.07.18
✎
09:08
|
(0) Это практически невозможно объяснить, надо смотреть код.
|
|||
2
H A D G E H O G s
24.07.18
✎
09:10
|
Ну или набраться терпения и собирать граф взаимоблокировки в sql profiler. Долго, но надёжно.
|
|||
3
user4fun
24.07.18
✎
09:16
|
(2) Подскажите по каким событиям смотреть в Profiler?
|
|||
4
H A D G E H O G s
24.07.18
✎
09:19
|
Граф взаимоблокировки. Так и называется.
|
|||
5
user4fun
24.07.18
✎
09:38
|
(4) Спасибо! запустил, отслеживаю.
|
|||
6
mr freeman
24.07.18
✎
10:13
|
(5) не занимайся дичью. Открой сессию extended events system_health, найди там deadlock report
А какая версия платформы? |
|||
7
user4fun
24.07.18
✎
10:13
|
(6) 1С:Предприятие 8.3 (8.3.8.2322)
|
|||
8
mr freeman
24.07.18
✎
10:17
|
(6) оч. странно что возник дедлок на субд. По репорту надо понять причину, их м.б. 2, найди репорт, сохрани в XML и выложи
|
|||
9
H A D G E H O G s
24.07.18
✎
10:18
|
(8) Повышение уровня изоляции, почти наверняка запрос в обработчике записи.
|
|||
10
mr freeman
24.07.18
✎
10:27
|
У него дэдлок на СУБД, а не на сервере 1С. На управляемых до этого не должно доходить. Нужен репорт.
|
|||
11
H A D G E H O G s
24.07.18
✎
10:29
|
(10) Да вы капитан очевидность, с чего бы я его послал за графом в profiler ? И на управляемых deadlock на СУБД бывает.
|
|||
12
user4fun
24.07.18
✎
10:32
|
(10) У меня обычные формы. Как можно тут прикрепить файл xml?
|
|||
13
mr freeman
24.07.18
✎
10:34
|
(11)в обозначенном тобой кейсе дэдлок возник бы на сервере 1с. У него 8.3 и версионирование, с чего им быть?
|
|||
14
mr freeman
24.07.18
✎
10:34
|
(12) режим совместимости 8.2? Выложи на облако мэйл.ру
|
|||
15
Вафель
24.07.18
✎
10:35
|
(14) переходи на режим 8.3
|
|||
16
Вафель
24.07.18
✎
10:35
|
ну или просто можно включить версионирование, если упр блокировки
|
|||
17
user4fun
24.07.18
✎
10:39
|
(14) Режим совместимости интерфейса 8.2, Режим совместимости 8.3.5. https://cloud.mail.ru/public/2cPo/aRNvqofMC
|
|||
18
H A D G E H O G s
24.07.18
✎
10:59
|
Двое ребят захотели почитать и записать свои изменения в планы обмена.
|
|||
19
user4fun
24.07.18
✎
11:01
|
(18) Как быть в этой ситуации?
|
|||
20
H A D G E H O G s
24.07.18
✎
11:06
|
(19)
а) 8.3 б) ручной перевод в snapshot в) в передзаписью выполнять запрос выборки всех полей из планов обмена с опцией ДЛЯ ИЗМЕНЕНИЯ |
|||
21
H A D G E H O G s
24.07.18
✎
11:06
|
и отбором по ссылке
|
|||
22
МешочекЗнаний
24.07.18
✎
11:09
|
(21) Снимаю шляпу, доходчиво объяснил
|
|||
23
H A D G E H O G s
24.07.18
✎
11:11
|
(22) Что непонятного? Вот, например так:
Процедура ПередЗаписью(Отказ) Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | НоменклатураИзменения.Узел, | НоменклатураИзменения.НомерСообщения, | НоменклатураИзменения.Ссылка |ИЗ | Справочник.Номенклатура.Изменения КАК НоменклатураИзменения |ГДЕ | НоменклатураИзменения.Ссылка = &Ссылка | |ДЛЯ ИЗМЕНЕНИЯ | Справочник.Номенклатура.Изменения"; Запрос.УстановитьПараметр("Ссылка",ЭтотОбъект.Ссылка); Запрос.Выполнить(); |
|||
24
H A D G E H O G s
24.07.18
✎
11:12
|
(23) Но, на самом деле, (23) - нужно в самом конце ПередЗаписью(), но до начала ПриЗаписи()
|
|||
25
МешочекЗнаний
24.07.18
✎
11:13
|
(23) Это была не критика
|
|||
26
user4fun
24.07.18
✎
11:19
|
(24) В модуль какого объекта это нужно написать?
|
|||
27
МешочекЗнаний
24.07.18
✎
11:23
|
Запрос.УстановитьПараметр("Ссылка",ЭтотОбъект.Ссылка);
|
|||
28
user4fun
24.07.18
✎
11:25
|
(27) Это для каждого объекта конфигурации прописывать??
|
|||
29
mr freeman
24.07.18
✎
11:37
|
Мде...щас тут насоветуют.
Во-первых причина дэдлока-захват ресурсов в разном порядке, а не повышение уровня изоляции, как тут пишет один товарищ. Во-вторых непонятно откуда эта конструкция with(repeatableread) если платформа на 8.3 и должно быть включено mvcc. Что скажет запрос select name, is_read_commited_snapshot_on from sys.databases |
|||
30
mr freeman
24.07.18
✎
11:39
|
Блин а какой режим блокировок в свойствах конфигурации???
|
|||
31
user4fun
24.07.18
✎
11:45
|
(30) Режим блокировок стоит автоматический, а по запросу все базы показывают 0.
|
|||
32
mr freeman
24.07.18
✎
11:47
|
(31) переводи на управляемый.
|
|||
33
user4fun
24.07.18
✎
11:49
|
(32) Какие последствия это может повлечь?
|
|||
34
mr freeman
24.07.18
✎
11:49
|
Проще перевести на управляемый чем разбирать это дерьмо с дэдлоками на автоматическом режиме
|
|||
35
H A D G E H O G s
24.07.18
✎
11:53
|
(29) Я это писал еще до репорта, не передергивай.
|
|||
36
H A D G E H O G s
24.07.18
✎
11:53
|
(30) Вот это поворот, да?
|
|||
37
H A D G E H O G s
24.07.18
✎
11:54
|
(34) Дада, переведите на управляемый, потом через месяцок посмотрим на остатки.
|
|||
38
H A D G E H O G s
24.07.18
✎
11:54
|
(33) Кривой контроль остатков.
|
|||
39
H A D G E H O G s
24.07.18
✎
11:55
|
(33) Если перевод имеется ввиду "включил галочку 'Управляемый'"
|
|||
40
mr freeman
24.07.18
✎
12:03
|
Перевод на управляемый режим подразумевает явную установку упр блокировок где нужно (если типовая то ищешь ДЛЯ ИЗМЕНЕНИЯ и там прописываешь).
Кстати Ежов а где ты видел дэдлоки на субд на упр режиме с вкл mvcc и maxdop 1? |
|||
41
mr freeman
24.07.18
✎
12:07
|
Там где нужно это где контроль остатков как правило
|
|||
42
H A D G E H O G s
24.07.18
✎
12:07
|
(40) deadlock-и видел на упр. режиме, но mvcc скорее всего был еще выключен.
|
|||
43
mr freeman
24.07.18
✎
13:02
|
(42) похоже что ты их вообще не видел, а только на курсах слышал, т.к. твой совет по добавлению конструкции ДЛЯ ИЗМЕНЕНИЯ не годится для случая с захватом ресурсов в разном порядке.
|
|||
44
H A D G E H O G s
24.07.18
✎
13:03
|
(43) Видел, видел, не боись. Могу даже показать окошечко 1С-а.
|
|||
45
H A D G E H O G s
24.07.18
✎
13:04
|
(43) Мой совет дан именно для эскалации уровня, так как пляшем от проблемы, а не гипотезируем, че там в каком порядке захватит план обмена при обмене.
|
|||
46
mr freeman
24.07.18
✎
13:13
|
Там же 2 таблицы, регистрации изменений и справочника. Что тебе даст
1. U ид1 наложена, X ид2 ждет 2. X ид2 наложена, U ид1 ждет |
|||
47
H A D G E H O G s
24.07.18
✎
13:16
|
(46) Если U наложена, X не наложется.
|
|||
48
H A D G E H O G s
24.07.18
✎
13:17
|
1. U ид1 наложена, X ид2 наложена
2. X ид2 Ждет, U ид1 наложена (или таймаут) |
|||
49
mr freeman
24.07.18
✎
13:20
|
(47) а разве в (46) наложилось? А дэдлок есть. Как у ТС. Не видно разве тебе?
|
|||
50
mr freeman
24.07.18
✎
13:21
|
Х ид2 тоже наложена, это другая таблица
|
|||
51
mr freeman
24.07.18
✎
13:22
|
Под пунктами 1. и 2. разные таблицы
|
|||
52
H A D G E H O G s
24.07.18
✎
13:23
|
(51) Я думал, разные транзакции
|
|||
53
mr freeman
24.07.18
✎
13:26
|
(52) ид1 и ид2 разные транзакции. А эти пункты вставлены в контексте моих слов про 2 таблицы. Так что же делать ТС-у теперь?
|
|||
54
H A D G E H O G s
24.07.18
✎
13:42
|
На данный момент:
1 транзакция: X Таб2 наложена, X Таб1 ждет (жертва) 2 транзакция: X Таб1 наложена, S Таб2 ждет Да, я ступил, не посмотрел, что разные таблицы. Это захват ресурсов в разном порядке и ДЛЯ ИЗМЕНЕНИЯ тут не прокатит. Признаю свою ошибку. |
|||
55
mr freeman
24.07.18
✎
13:48
|
ТС-у можно посоветовать убрать говнокод по записи характеристики при изменении строки, обмениваться ночью, но все равно это дерьмо может вылезти когда-нибудь еще.
|
|||
56
user4fun
24.07.18
✎
13:51
|
(55) (54) Спасибо!
|
|||
57
H A D G E H O G s
24.07.18
✎
13:52
|
Стапэ
|
|||
58
H A D G E H O G s
24.07.18
✎
13:52
|
(55) Эй, freeman, ну стопэ
|
|||
59
H A D G E H O G s
24.07.18
✎
13:53
|
Если мы сделаем запрос ДЛЯ ИЗМЕНЕНИЯ - мы тупо наложим U блокировку на Таб1 раньше, чем платформа наложит X блокировку на Таб2 в первой транзакции
|
|||
60
H A D G E H O G s
24.07.18
✎
13:54
|
Речь идет про 1 (пользовательскую, жертвенную) транзакцию.
Так, freeman ? |
|||
61
H A D G E H O G s
24.07.18
✎
13:54
|
Этим мы изменим порядок захвата.
|
|||
62
mr freeman
24.07.18
✎
14:00
|
Тут не важно что будет U или S, мы не можем меняя тип управлять порядком их наложения. U это чисто для исключения s-s
|
|||
63
H A D G E H O G s
24.07.18
✎
14:04
|
(62) Почему не можем? Вот такая картина будет
1 транзакция: U Таб1 ждет, X Таб2 наложена, X Таб1 наложена (бывшая жертва) 2 транзакция: X Таб1 наложена, S Таб2 наложена |
|||
64
mr freeman
24.07.18
✎
14:08
|
А как у тебя одновременно наложены X и S на Таб2?
|
|||
65
H A D G E H O G s
24.07.18
✎
14:11
|
(64) Никак.
U будет ждать X до конца транзакции 2 и наоборот. |
|||
66
mr freeman
24.07.18
✎
14:11
|
И как можно одновременно наложить U и X в 1-й транзакции?
|
|||
67
H A D G E H O G s
24.07.18
✎
14:12
|
(66) Как угодно, бро. Как угодно.
|
|||
68
mr freeman
24.07.18
✎
14:14
|
(67) это для меня слишком сложно
|
|||
69
H A D G E H O G s
24.07.18
✎
14:16
|
(68) В рамках одной транзакции совместимы любые блокировки. Общего назначения уж точно, не скажу про всякие блокировки намеряний, не углублялся.
|
|||
70
H A D G E H O G s
24.07.18
✎
14:18
|
(68) За extended events system_health спасибо, кстати, какой бы ты злобной личностью бы не был. Я догадывался, что граф можно достать каким-нибудь dmv-ом, но как то руки не доходили, да и не особо нужно с управляемыми блокировками уже.
|
|||
71
mr freeman
24.07.18
✎
14:21
|
Совместимы в плане чего? Ты не можешь x превратить в u до окончания транзакции, так же как и u в s. Короче я не понимаю о чем ты, делай репро, выкладывай на ютуб, но я итак вижу что ты говоришь какие-то странные вещи.
|
|||
72
H A D G E H O G s
24.07.18
✎
14:22
|
(71) Просто забей.
|
|||
73
H A D G E H O G s
24.07.18
✎
14:27
|
(71) Вот, кстати, можешь почитать б-гмерской литературки.
https://its.1c.ru/db/metod8dev/content/4051/hdoc/_top/deadlock Там в конце наш случай и мое решение, начиная со строк: Для этого следует выполнить запрос с опцией "ДЛЯ ИЗМЕНЕНИЯ" к таблице остатков регистра "ТоварыКПередачеОрганизаций". Переход по ссылке, ctrl+f, ctrl+v, enter |
|||
74
mr freeman
24.07.18
✎
14:39
|
Ну я понял. В той транзакции где идет чтение изменений наложить U на справочник чтобы другая транзакция не могла менять справочник и ожидала.
|
|||
75
mr freeman
24.07.18
✎
14:45
|
Т.е. блокировать все нужные ресурсы с самого начала транзакции. Классика жанра борьбы с дэдлоками если невозможен одинаковый порядок захвата.
|
|||
76
H A D G E H O G s
24.07.18
✎
14:47
|
(75) Да, именно.
|
|||
77
mr freeman
24.07.18
✎
15:19
|
(0) ТС попробуй перед записью характеристики блокировать таблицу регистрации изменений запросом в (23) но не в модуле объекта а перед ХарактеристикаНоменклатуры.Записать(), а все это безобразие нужно завернуть в транзакцию, начать ее перед запросом, зафиксировать после записи.
|
|||
78
user4fun
25.07.18
✎
06:35
|
(77) Благодарю.
|
|||
79
H A D G E H O G s
25.07.18
✎
11:06
|
За столбом гор фактов мы выплеснули ребенка.
Теперь, когда блокировка будет наложены и методологически все будет верно, юзер будет православно отваливаться по таймауту через 20 секунд, а не сразу и некошерно :-) https://coub.com/view/16pe9l |
|||
80
mr freeman
25.07.18
✎
11:20
|
(79) я сегодня подумал что U надо накладывать в обоих сеансах в начале транзакции, причем в одинаковом порядке на обе таблицы. Только в этом случае мы заставим 2-ю транзакцию, которая читает, ждать, т.к. U и S совместимы. Осталось только найти контекст виновника (контекст жертвы в ТЖ) и в обоих местах сделать это.
|
|||
81
mr freeman
25.07.18
✎
11:23
|
Т.к. U и S совместимы читать как нельзя оставлять S вообще.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |