Имя: Пароль:
1C
1С v8
Конфликт блокировок при выполнении кода на сервере
0 andrew090990
 
01.09.15
10:09
Есть код, в котором устанавливается управляемая блокировка на регистр бухгалтерии. Блокировка по регистратору. Этот код выполняется одновременно в двух сеансах на сервере, по разным регистраторам. При этом возникает конфликт блокировок, хотя они по разным значениям полей. Если же то же самое проделать в толстом клиенте, конфликт не возникает. Подскажите в чем может быть дело? База на MS SQL.
1 Дык ё
 
01.09.15
10:41
разделение итогов включено?
2 andrew090990
 
01.09.15
11:15
(1) Включено
3 Armando
 
01.09.15
11:20
Кот покажи
4 andrew090990
 
01.09.15
12:04
Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Текст = "";
    Пока Выборка.Следующий() Цикл
        Текст = Текст + ", " + Строка(Выборка.Ссылка);
    КонецЦикла;
    Выборка.Сбросить();
    ЗаписьЖурналаРегистрации("ОТЛАДКА", УровеньЖурналаРегистрации.Примечание, ,, Текст);
    
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    
    Блокировка = Новый БлокировкаДанных;
    ЭБ = Блокировка.Добавить("РегистрБухгалтерии.ИС_Бюджетирование.НаборЗаписей");
    ЭБ.Режим = РежимБлокировкиДанных.Исключительный;
    ЭБ.ИсточникДанных = Результат;
    ЭБ.ИспользоватьИзИсточникаДанных("Регистратор", "Ссылка");
    Блокировка.Заблокировать();
    
    Пока Выборка.Следующий() Цикл
        Набор = РегистрыБухгалтерии.ИС_Бюджетирование.СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить(Выборка.Ссылка);
        Набор.Записать();
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();




В одном сеансе ставлю отладку на паузу перед ЗафиксироватьТранзакцию(), в другом запускаю в это время и получаю конфликт блокировок. По записи в журнале регистрации проверяю, что регистраторы в этих двух сеансах точно не пересекаются.
5 uzerp2
 
01.09.15
12:38
1. ты же в одном сеансе заблокировал таблицу ИС_Бюджетирование, т.е. исключительная блокировка (уровень изоляции сериализабле)
2. а скорее всего во втором сеансе пробуешь прочитать из этой таблицы

а эти блокировки несовместимы!

по моему так!
6 uzerp2
 
01.09.15
12:43
возможно запрос делает скан всей таблицы, т.е. пробует обратиться ко всей таблице, поэтому и блокируется
7 andrew090990
 
01.09.15
13:00
(5) я же заблокировал не всю таблицу, а по определенным полям, а во втором сеансе - по другим значениям полей
(6) нет, там простой запрос для теста, выбирается только таблица документов Реализация товаров
8 uzerp2
 
01.09.15
13:03
в доках еще пишут что при уровне узоляции сериалазибле блокируются 2-е соседнии записи, т.е. сверху одна и снизу одна.
9 uzerp2
 
01.09.15
13:04
может запись в запросе именно туда попадает?
10 andrew090990
 
01.09.15
13:05
(8) (9) проверю
11 andrew090990
 
01.09.15
14:32
(8) (9) нет, этот вариант отпал.

Походу я ошибся с выводами, протестил более внимательно еще несколько раз, и дело обстоит несколько иначе. Различий при выполнении на сервере и в толстом клиенте вроде бы нет. Но если делать как я описывал выше, поставив точку останова для "паузы" блокировки перед ЗафиксироватьТранзакцию(), либо в любом месте цикла, и запустить во втором сеансе тот же код с другими регистраторами, то конфликта блокировок НЕ возникает. Если же просто сразу друг за другом стартануть в двух сеансах этот код (по разным регистраторам естественно), то возникает конфликт, ошибка выскакивает на строчке записи набора. Сам по себе каждый сеанс по отдельности отрабатывает за 40-50 секунд, если они друг другу не мешают. Ломаю голову.
12 Cyberhawk
 
01.09.15
14:34
У регистратора в метаданных блокировка тоже должна стоять управляемая, и у корня метаданных, по-моему, тоже
13 uzerp2
 
01.09.15
15:00
А что 1С-ка пишет, какая ошибка, скрин выложи!?
14 andrew090990
 
01.09.15
15:09
(12)
У корня стоит управляемая, у регистраторов тех, ко которым блокировка - тоже стоит управляемая.
(13) Вот ошибка:

{ОбщийМодуль.МодульРегламентныхЗаданий.Модуль(2756)}: Ошибка при вызове метода контекста (Записать)
                Набор.Записать();
по причине:
Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 11.0: Транзакция (идентификатор процесса 96) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
HRESULT=80004005, SQLSrvr: SQLSTATE=40001, state=33, Severity=D, native=1205, line=1
15 uzerp2
 
01.09.15
15:24
Ошибка явно на MSSQL
т.е. ошибка не на управляемых блокировках, не на сервере 1С

ты как бы устанавливаешь управляемую блокировку на сервере 1С, а ошибка возникает на MSSQL
у тебя точно управляемые режим включен на конфу?
если бы была ошибка на управляемых блокировках тебе бы выдавалось предупреждение на русском от сервера 1С Предприятия!


через профайлер пробовал разбираться?
попробуй установи фильтр по дюрейшен >=2секунды, базе, ну и там SQL тексту запроса...
16 uzerp2
 
01.09.15
15:33
попробуй НачатьТранзакцию() и Заблокировать перенести перед Запрос.Выполнить()

ну для того чтобы понять что не так!
17 H A D G E H O G s
 
01.09.15
15:33
deadlock на стороне СУБД.

Скорее всего документы в выборке пересекаются в 2 сессиях.
18 H A D G E H O G s
 
01.09.15
15:36
И их нет в РС Бухгалтерии.
19 andrew090990
 
01.09.15
15:43
Документы точно не пересекаются, уже много раз проверял.
Планирую сейчас провести тест: зарегистрирую ту же базу сервера SQL в новой базе сервера 1С, и запущу один сеанс с из старой базы, а один из новой. Если конфликт блокировок возникнет, значит проблема SQL-ная, иначе - СУБД.
20 Cyberhawk
 
01.09.15
15:53
"проблема SQL-ная, иначе - СУБД" - а в чем разница?
21 andrew090990
 
01.09.15
16:14
(20) описался)
(15) (17) проделал эксперимент из (19) - похоже действительно ошибка на стороне MSSQL
22 Гёдза
 
01.09.15
16:16
кстати объект Блокировка тут не нужна, ибо набор записей сам все блокирует как надо
23 andrew090990
 
01.09.15
16:48
(22) изначально и не делал, не работало все равно, это уже добавил в процессе танцев с бубнами
Сейчас может попробуем с помощью гилёвского сервиса чего-нибудь посмотреть
24 Гёдза
 
01.09.15
16:56
просто отчистка регистра в потоках?
25 andrew090990
 
01.09.15
17:12
(24) да, пытаюсь многопоточно очистить регистр
26 regi1984
 
01.09.15
17:14
Перед очисткой предлагаю временно отключить итоги в регистре
27 andrew090990
 
01.09.15
17:33
(26) В таком случае пеерсчет итогов убьет весь выигрыш от многопоточности, к тому же хочется чисто технически узнать ответ на вопрос, почему глючит.
28 Гёдза
 
01.09.15
17:35
при записи регистра случайно никаких процедур нет?
29 andrew090990
 
01.09.15
17:41
(28) это еще не приходило в голову, пошел проверять!
30 Гёдза
 
01.09.15
17:47
(29) Ибо взимоблокировки на 1 ресурсе - это блокировки повышения уровня блокировки, но тут чтения то нет совсем
31 andrew090990
 
01.09.15
18:03
(28) Еще может быть это вообще блокировка не по регистру бухгалтерии. Есть последовательность, зависящая от данного регистра, там много кода выполняется при записи, буду проверять
32 andrew090990
 
01.09.15
18:10
Хотя тогда ошибка вываливалась бы на конкретной строчке обработчика (будь то в модуле набора записей регистра, процедуре на подписке и т.п.), а она вываливается именно на строчке Набор.Записать(). Все равно попробую когда реструктуризация закончится (решил попробовать с отключенным разделением итогов).
33 andrew090990
 
03.09.15
14:00
Подключил к сервису Гилёва и выяснил, что взаимоблокировка возникает по таблице регистр бухгалтерии - субконто 1
34 andrew090990
 
03.09.15
14:04
а так же и по другим субконто
35 Гёдза
 
03.09.15
14:10
(33) Контроль остатков?
36 andrew090990
 
03.09.15
14:23
(35) Просто очищаются наборы записей по разным регистраторам в 2 потока. Никакого другого кода при этом (фоновые задания, подписки т.п.) не выполняется.
37 andrew090990
 
03.09.15
14:26
Даже скажу точнее, согласно сервису Гилева, взаимоблокировка действительно возникает между двумя потоками, когда в каждом из них выполняется одна и та же строка - Набор.Записать(). Это тоже подтвержает что какой-либо внешний код (фоновое задание например какое-нибудь) тут непричем.
38 andrew090990
 
07.09.15
10:54
При записи набор записей РБ, в скуле взаимоблокировка возникает при пересечении по каким полям? При условии что совпадают измерения, то при совпадении любой из комбинаций Счет + Субконто1, Счет + Субконто1 + Субконто2, Счет + Субконто1 + Субконто2 + Субконто3, вроде бы так? Тогда получается достаточно чтобы не конфликтовало по комбинации Счет + Субконто1 + измерерния, так?
39 ЧеловекДуши
 
07.09.15
11:17
(4) А для чего вам именно "РежимБлокировкиДанных.Исключительный" исключительная блокировка?
А ты пробовал раздельную? И что тогда пишет?
...Данные так и так будут на момент проведения транзакции липовыми, коль вы в транзакции очищаете регистр...

Да и бухгалтера в основном работают с данными за вчера. :)
40 andrew090990
 
07.09.15
11:22
(39) Я восновном пробую вообще без управляемой блокировки, т.к. ошибка то в конфликте блокировок SQL.
41 Гёдза
 
07.09.15
11:25
Тут взаимоблокировка вида
X(P1) > S(P1+P2)
X(P2) > S(P1+P2)
смотри где у тебя чтение идет
42 andrew090990
 
07.09.15
11:41
(41) Чтения нигде нет
43 Гёдза
 
07.09.15
11:42
(42) а запись чего-нибудь другого?
44 Гёдза
 
07.09.15
11:43
последовательность кстати автоматом двигается?
45 andrew090990
 
07.09.15
11:46
(44) Щас вообще ее отключил, точнее исключил данный регистр из списка регистров от которых зависит последовательность. (43) Вот сервис Гилёва конкретно показывает строчки кода в обоих процессах, при выполнении которых возникла взаимоблокировка - в обоих процессах это Набор.Записать()
46 Гёдза
 
07.09.15
11:50
Можешь логин-пароль сказать к сервису?
47 andrew090990
 
07.09.15
12:43
(46) Не дозволено) Могу скрины сделать интересующего
48 Гёдза
 
07.09.15
12:46
граф взаимоблокировки выложи
49 andrew090990
 
07.09.15
12:57
(48)
<deadlock-list>
<deadlock victim="process560009498">
  <process-list>
   <process id="process560009498" taskpriority="0" logused="100940" waitresource="PAGE: 14:1:911203 " waittime="119" ownerId="4094745" transactionname="user_transaction" lasttranstarted="2015-09-07T12:00:32.180" XDES="0x55d3a0d28" lockMode="IX" schedulerid="11" kpid="4796" status="suspended" spid="72" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2015-09-07T12:00:40.903" lastbatchcompleted="2015-09-07T12:00:40.900" lastattention="1900-01-01T00:00:00.900" clientapp="1CV83 Server" hostname="SRV-DEV" hostpid="4924" loginname="sa" isolationlevel="read committed (2)" xactid="4094745" currentdb="14" lockTimeout="20000" clientoption1="671219744" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="66" sqlhandle="0x02000000663d1c021a8f7ad74646558ba315e63f0bfdbe6d0000000000000000000000000000000000000000">
INSERT INTO dbo._AccRgAT35657 (_Period, _AccountRRef, _Fld5629RRef, _Fld5630RRef, _Fld5631RRef, _Fld7041RRef, _Fld8081RRef, _Value1_TYPE, _Value1_L, _Value1_S, _Value1_RTRef, _Value1_RRRef, _Value2_TYPE, _Value2_L, _Value2_S, _Value2_RTRef, _Value2_RRRef, _Value3_TYPE, _Value3_L, _Value3_S, _Value3_RTRef, _Value3_RRRef, _Fld5633, _TurnoverDt5646, _TurnoverCt5647, _Turnover5648, _Fld5634, _TurnoverDt5649, _TurnoverCt5650, _Turnover5651, _Fld5632, _TurnoverDt5643, _TurnoverCt5644, _Turnover5645, _Fld5635, _TurnoverDt5652, _TurnoverCt5653, _Turnover5654, _Fld7683, _TurnoverDt7686, _TurnoverCt7687, _Turnover7688, _Fld7684, _TurnoverDt7689, _TurnoverCt7690, _Turnover7691, _Fld7685, _TurnoverDt7692, _TurnoverCt7693, _Turnover7694, _Splitter) SELECT
T1._Period,
T1._AccountRRef,
T1._Fld5629RRef,
T1._Fld5630RRef,
T1._Fld5631RRef,
T1._Fld7041RRef,
T1._Fld8081RRef,
T1._Value1_TYPE,
T1._Value1_L,
T1._Value1_S,
T1._Value1_RTRef,
T1._Value1_RRRef,
T1._Value2_TYPE,
T1._Value2_L,
T1._Value2_S,
T1._Value2_RTRef,
T1._Value2_RR     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@P1 numeric(10),@P2 numeric(10))INSERT INTO dbo._AccRgAT35657 (_Period, _AccountRRef, _Fld5629RRef, _Fld5630RRef, _Fld5631RRef, _Fld7041RRef, _Fld8081RRef, _Value1_TYPE, _Value1_L, _Value1_S, _Value1_RTRef, _Value1_RRRef, _Value2_TYPE, _Value2_L, _Value2_S, _Value2_RTRef, _Value2_RRRef, _Value3_TYPE, _Value3_L, _Value3_S, _Value3_RTRef, _Value3_RRRef, _Fld5633, _TurnoverDt5646, _TurnoverCt5647, _Turnover5648, _Fld5634, _TurnoverDt5649, _TurnoverCt5650, _Turnover5651, _Fld5632, _TurnoverDt5643, _TurnoverCt5644, _Turnover5645, _Fld5635, _TurnoverDt5652, _TurnoverCt5653, _Turnover5654, _Fld7683, _TurnoverDt7686, _TurnoverCt7687, _Turnover7688, _Fld7684, _TurnoverDt7689, _TurnoverCt7690, _Turnover7691, _Fld7685, _TurnoverDt7692, _TurnoverCt7693, _Turnover7694, _Splitter) SELECT
T1._Period,
T1._AccountRRef,
T1._Fld5629RRef,
T1._Fld5630RRef,
T1._Fld5631RRef,
T1._Fld7041RRef,
T1._Fld8081RRef,
T1._Value1_TYPE,
T1._Value1_L,
T1._Value1_S,
T1._Value1_RTRef,
T1._Value1_RRRef,
T1._Value2_TYPE,
T1._Value2_L,
T1._Value2_    </inputbuf>
   </process>
   <process id="process56132d498" taskpriority="0" logused="281500" waitresource="PAGE: 14:1:911203 " waittime="129" ownerId="4100931" transactionname="user_transaction" lasttranstarted="2015-09-07T12:00:40.920" XDES="0x4c26216a8" lockMode="IX" schedulerid="8" kpid="1676" status="suspended" spid="75" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2015-09-07T12:00:41.417" lastbatchcompleted="2015-09-07T12:00:41.413" lastattention="1900-01-01T00:00:00.413" clientapp="1CV83 Server" hostname="SRV-DEV" hostpid="4924" loginname="sa" isolationlevel="read committed (2)" xactid="4100931" currentdb="14" lockTimeout="20000" clientoption1="671219744" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="66" sqlhandle="0x0200000073c92733e7f8d637d1c616367850964ef8ab067f0000000000000000000000000000000000000000">
INSERT INTO dbo._AccRgAT35657 (_Period, _AccountRRef, _Fld5629RRef, _Fld5630RRef, _Fld5631RRef, _Fld7041RRef, _Fld8081RRef, _Value1_TYPE, _Value1_L, _Value1_S, _Value1_RTRef, _Value1_RRRef, _Value2_TYPE, _Value2_L, _Value2_S, _Value2_RTRef, _Value2_RRRef, _Value3_TYPE, _Value3_L, _Value3_S, _Value3_RTRef, _Value3_RRRef, _Fld5633, _TurnoverDt5646, _TurnoverCt5647, _Turnover5648, _Fld5634, _TurnoverDt5649, _TurnoverCt5650, _Turnover5651, _Fld5632, _TurnoverDt5643, _TurnoverCt5644, _Turnover5645, _Fld5635, _TurnoverDt5652, _TurnoverCt5653, _Turnover5654, _Fld7683, _TurnoverDt7686, _TurnoverCt7687, _Turnover7688, _Fld7684, _TurnoverDt7689, _TurnoverCt7690, _Turnover7691, _Fld7685, _TurnoverDt7692, _TurnoverCt7693, _Turnover7694, _Splitter) SELECT
T1._Period,
T1._AccountRRef,
T1._Fld5629RRef,
T1._Fld5630RRef,
T1._Fld5631RRef,
T1._Fld7041RRef,
T1._Fld8081RRef,
T1._Value1_TYPE,
T1._Value1_L,
T1._Value1_S,
T1._Value1_RTRef,
T1._Value1_RRRef,
T1._Value2_TYPE,
T1._Value2_L,
T1._Value2_S,
T1._Value2_RTRef,
T1._Value2_RR     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@P1 numeric(10),@P2 numeric(10))INSERT INTO dbo._AccRgAT35657 (_Period, _AccountRRef, _Fld5629RRef, _Fld5630RRef, _Fld5631RRef, _Fld7041RRef, _Fld8081RRef, _Value1_TYPE, _Value1_L, _Value1_S, _Value1_RTRef, _Value1_RRRef, _Value2_TYPE, _Value2_L, _Value2_S, _Value2_RTRef, _Value2_RRRef, _Value3_TYPE, _Value3_L, _Value3_S, _Value3_RTRef, _Value3_RRRef, _Fld5633, _TurnoverDt5646, _TurnoverCt5647, _Turnover5648, _Fld5634, _TurnoverDt5649, _TurnoverCt5650, _Turnover5651, _Fld5632, _TurnoverDt5643, _TurnoverCt5644, _Turnover5645, _Fld5635, _TurnoverDt5652, _TurnoverCt5653, _Turnover5654, _Fld7683, _TurnoverDt7686, _TurnoverCt7687, _Turnover7688, _Fld7684, _TurnoverDt7689, _TurnoverCt7690, _Turnover7691, _Fld7685, _TurnoverDt7692, _TurnoverCt7693, _Turnover7694, _Splitter) SELECT
T1._Period,
T1._AccountRRef,
T1._Fld5629RRef,
T1._Fld5630RRef,
T1._Fld5631RRef,
T1._Fld7041RRef,
T1._Fld8081RRef,
T1._Value1_TYPE,
T1._Value1_L,
T1._Value1_S,
T1._Value1_RTRef,
T1._Value1_RRRef,
T1._Value2_TYPE,
T1._Value2_L,
T1._Value2_    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <pagelock fileid="1" pageid="911203" dbid="14" subresource="FULL" objectname="dev6_msota.dbo._AccRgAT35657" id="lock481a0bc00" mode="S" associatedObjectId="72057597165830144">
    <owner-list>
     <owner id="process56132d498" mode="S"/>
     <owner id="process56132d498" mode="IX" requestType="convert"/>
    </owner-list>
    <waiter-list>
     <waiter id="process560009498" mode="IX" requestType="convert"/>
    </waiter-list>
   </pagelock>
   <pagelock fileid="1" pageid="911203" dbid="14" subresource="FULL" objectname="dev6_msota.dbo._AccRgAT35657" id="lock481a0bc00" mode="S" associatedObjectId="72057597165830144">
    <owner-list>
     <owner id="process560009498" mode="S"/>
     <owner id="process560009498" mode="IX" requestType="convert"/>
    </owner-list>
    <waiter-list>
     <waiter id="process56132d498" mode="IX" requestType="convert"/>
    </waiter-list>
   </pagelock>
  </resource-list>
</deadlock>
</deadlock-list>