Имя: Пароль:
1C
1С v8
план обмена и блокировки MS SQL
,
0 Black Dragon
 
03.03.15
11:01
Всем доброго дня!

запустил в базе план обмена для выгрузки изменений в другую идентичную базу, все работает, все счастливы!

однако, не все в жизни так прекрасно, как хотелось бы!
периодически происходит блокировка на MS SQL

http://gyazo.com/0775a913c5b43ae3be4ee92e00bce6ed

как с этим боротся? был ли у кого опыт подобного?
1 Лефмихалыч
 
03.03.15
11:02
(0) платформа 8.0?
2 Black Dragon
 
03.03.15
11:02
8.1
3 Black Dragon
 
03.03.15
11:05
перевел базу MS SQL в режим версионирования, не помогло!

пишут:
Включение уровня изоляции Read commited shapshot в MS SQL позволяет практически полностью избежать блокировок на уровне MS SQL при использовании управляемого режима

Собственно рецепт: 1) Выгоняем всех из базы 2) Открываем SQL Server Management Studio, New Query 3) Пишем:
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

Но не помогает! Видимо, у 8.1 управляемые блокировки пока еще были слабо организованы
4 Лефмихалыч
 
03.03.15
11:05
(2) а конфигурация "1С:Учет арбузов и бахчевой проебизнес"?
5 Black Dragon
 
03.03.15
11:06
WMS 3.1 Логитон
6 Лефмихалыч
 
03.03.15
11:07
на самом деле - пох. Включай технологический журнал, ищи где падает, смотри в код 1С, думай. Волшебной палки не существует.
7 Лефмихалыч
 
03.03.15
11:07
(5) на каком объекте-то хоть валится, ты знаешь?
8 Black Dragon
 
03.03.15
11:08
РН Заказы
9 Black Dragon
 
03.03.15
11:09
как только с ним операции выполняю, в пределах 10 мин происходит блокировка
10 Лефмихалыч
 
03.03.15
11:10
(9) не тычь пальцем в небо, включи ТЖ
11 Black Dragon
 
03.03.15
11:10
План обмена читает изменения по регламенту каждые 10 минут, тут как-то можно обойти блокировку изменений?
12 Лефмихалыч
 
03.03.15
11:11
(11) в том смысле, что у тебя следующий обмен стартует раньше, чем заканчивается предыдущий что ли?
13 Лефмихалыч
 
03.03.15
11:12
Автор, помощь нужна тебе или мне? Какого лешего из тебя информацию вытягивать клещами приходится?
14 Black Dragon
 
03.03.15
11:13
(12) почему так решил? с обменами все норм, 2-3 сек
15 Лефмихалыч
 
03.03.15
11:13
(14) давай, до свидания. Устал я тебя пытать
16 Black Dragon
 
03.03.15
11:14
в тот момент, когда происходит чтение изменений, выполняется блокировка на запись в БД, правильно?
17 Black Dragon
 
03.03.15
11:14
есть ли нетиповые варианты получать изменения по плану обмена без этих негативных ньюансов?
19 H A D G E H O G s
 
03.03.15
11:28
(0) Конфликт ~взаимоблокировок~ на уровне СУБД.

Его ОДНОЗНАЧНО надо устранять.
20 H A D G E H O G s
 
03.03.15
11:34
(0) Профайлер и сбор TDeadlocksGraph и его анализ примерно вооот так:

http://www.sql.ru/forum/913820/pomogite-proanalizirovat-deadlock-graph
21 Necessitudo
 
03.03.15
11:41
(17) Делай прямой запрос к таблице на MS SQL.
22 Black Dragon
 
03.03.15
12:19
(21) я же не SQL программировать пытаюсь, а 1С, и тем более можно наткнутся на проблемы с построителем и оптимизатором сервера 1С, с ними получить взаимоблокировки!
23 Black Dragon
 
03.03.15
12:20
а по плану обмена кто нибудь имеет опыт чтения изменений без блокировок данных?
24 H A D G E H O G s
 
03.03.15
12:33
(23) Нет. Таких идиотов ты вряд ли найдешь.
25 H A D G E H O G s
 
03.03.15
12:34
(22) Сервер 1С тут не причем. Ты натолкнулся на взаимоблокироку СУБД, а не 1С.
Причина - кот. Ващ, 1С-оский кот.
26 Black Dragon
 
03.03.15
12:36
(25) это я про прямой запрос к SQL серверу писал
27 Black Dragon
 
03.03.15
12:37
а вот по факту - отключил временно обмен, блокировки исчезли, у меня план обмена полный используется, видимо, поэтому так и происходит
28 Black Dragon
 
03.03.15
12:39
регламент обмена делал как в книге знаний рекомендовано)

    ИспользоватьОбмен = Константы.ИспользоватьОбмен.Получить();
    ИмяФайлаЖурнала   = Константы.МиграцияФайлЖурнала.Получить();
    
    ФайлЖурнала = Новый ЗаписьТекста(ИмяФайлаЖурнала, КодировкаТекста.Системная,,Истина);

    //Выбираем все узлы из плана обмена, за исключением текущего

    Если НЕ ИспользоватьОбмен Тогда
        ФайлЖурнала.ЗаписатьСтроку("" + ТекущаяДата() + " использование обмена отключено!");
        ФайлЖурнала.Закрыть();
        Возврат;
    КонецЕсли;
    
    //Проверим доступность каталога обмена
    ПутьКаталогаОбмена = Константы.ПутьФайловОбмена.Получить();
    КаталогНаДиске = Новый Файл(ПутьКаталогаОбмена);
    Если НЕ КаталогНаДиске.Существует() Тогда //каталог доступен, все ОК
        ФайлЖурнала.ЗаписатьСтроку("" + ТекущаяДата() + " Каталог не доступен, обмен не выполнен!!!");
        ФайлЖурнала.Закрыть();
        Возврат;
    КонецЕсли;
    
    ВыборкаУзлов = ПланыОбмена.ПланОбмена.Выбрать();
    Пока ВыборкаУзлов.Следующий() Цикл
        Если ВыборкаУзлов.Ссылка = ПланыОбмена.ПланОбмена.ЭтотУзел() Тогда
            Продолжить;
        КонецЕсли;
    
        Узел = ВыборкаУзлов.Ссылка;
        ТекНомерПакета = Константы.МиграцияНомерПакета.Получить() + 1;
        ЗаписьXML = Новый ЗаписьXML();
        ПолноеИмяФайла = ПутьКаталогаОбмена + "\Msg" + Прав(СокрЛП(ПланыОбмена.ПланОбмена.ЭтотУзел().Код), 4) + Прав(СокрЛП(Узел.Код), 4) + Прав("000000000" + Строка(ТекНомерПакета),10) + ".xml";
        ЗаписьXML.ОткрытьФайл(ПолноеИмяФайла);
        ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
        ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел);
        ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);
        ЗаписьСообщения.ЗакончитьЗапись();
        ЗаписьXML.Закрыть();
        Константы.МиграцияНомерПакета.Установить(ТекНомерПакета);
        ФайлЖурнала.ЗаписатьСтроку("" + ТекущаяДата() + " Сформирован пакет обмена " + ТекНомерПакета);

    КонецЦикла;

    ФайлЖурнала.Закрыть();
29 Sammo
 
03.03.15
12:42
Я бы для начала все таки предложил разобраться - что именно лочится.
А для этого см. http://www.sql.ru/faq/faq_topic.aspx?fid=962
30 Black Dragon
 
03.03.15
12:47
(29) это то понятно, найду причину, но как ее бороть то? один из участников взаимоблокировки это план обмена, как я на него повлияю?
31 Black Dragon
 
03.03.15
12:48
как мне по душе, то я бы начал с того, что написать свой обработчик получения изменений по плану обмена без блокировок
32 Black Dragon
 
03.03.15
12:49
а по этой области знаний маловато, раньше этим не особо занимался, только настройкой типового обмена

кто посоветует что почитать по этому поводу?
33 H A D G E H O G s
 
03.03.15
13:09
(22)
http://rsdn.ru/article/db/deadlocks.xml#EGIAC

https://msdn.microsoft.com/ru-ru/library/ms178104(v=sql.105).aspx

https://msdn.microsoft.com/ru-ru/library/ms188246(v=sql.105).aspx


А лучше получить доступ к статье "Анализ и устранение взаимоблокировок" Константина Рупасова.
34 H A D G E H O G s
 
03.03.15
13:09
35 H A D G E H O G s
 
03.03.15
13:09
36 H A D G E H O G s
 
03.03.15
13:10
Но ты ниасилишь.
37 Black Dragon
 
03.03.15
13:23
(36) :-)

ну что за тенденция - просил инфу по плану обмена, а тут опять по взаимоблокировкам SQL
38 DEVIce
 
03.03.15
13:29
(37) Потому что у тебя взаимоблокировки :)
39 Black Dragon
 
03.03.15
13:32
уже нету :)
нет обмена, нет и блокировки!
40 Black Dragon
 
03.03.15
13:33
я писал в (30), но никто не читает видимо!
41 Black Dragon
 
03.03.15
14:03
ПланыОбменаМенеджер (ExchangePlansManager)
ЗаписатьИзменения (WriteChanges)
Синтаксис:
ЗаписатьИзменения(<Запись сообщения обмена>, <Элементов в транзакции>)
Параметры:
<Запись сообщения обмена> (обязательный)
Тип: ЗаписьСообщенияОбмена. Объект, через который осуществляется запись сообщения обмена данными. У этого объекта должен быть выполнен метод НачатьЗапись, но еще не выполнен метод ЗакончитьЗапись.
<Элементов в транзакции> (необязательный)
Тип: Число. Определяет максимальное число элементов данных, которые помещаются в сообщение в рамках одной транзакции базы данных. Если значение параметра равно 0 (значение по умолчанию), то все данные помещаются в рамках одной транзакции.
Такой режим является рекомендуемым, так как гарантирует согласованность данных, помещаемых в сообщение. Но при создании сообщения в многопользовательском режиме могут быть конфликты блокировок между транзакцией, в которой данные помещаются в сообщение, и транзакциями, выполняемыми другими пользователями. Для снижения вероятности возникновения таких конфликтов можно задать значение этого параметра, отличное от значения по умолчанию. Чем меньше значение параметра, тем меньше вероятность конфликта блокировок, но выше вероятность помещения в сообщение несогласованных данных.
Значение по умолчанию: 0
Описание:
Предназначен для помещения в сообщение обмена данными всех изменений данных и конфигурации для отправки в другой узел распределенной информационной базы
42 Лефмихалыч
 
03.03.15
14:04
(40) хочешь верь, хочешь нет, но дело в тебе. Алкоритм действий, которые тебе надо выполнить, чтобы побороть беду, в ветке есть.
43 Black Dragon
 
03.03.15
14:05
кто может пояснить, что значит несогласованность данных?
44 Black Dragon
 
03.03.15
14:05
(42) зрим в корень! зачем боротся с последствиями, если можно предотвратить причину!
45 Necessitudo
 
03.03.15
14:09
(22) Что за чушь? Какой построитель и оптимизатор сервера 1С? Select * From Table тебе за глаза хватит.
46 Black Dragon
 
03.03.15
14:10
если выгружать в каждый пакет (файл xml) по одному сообщению в хронологическом порядке, то вероятность блокировки будет стремится к 0!
47 H A D G E H O G s
 
03.03.15
14:16
(45) Кто номера сообщений будет в таблицы изменений записывать?
48 H A D G E H O G s
 
03.03.15
14:19
Вы, ребятки, забавный парни.
Если 1С что то сделала - она это не просто так сделала.
А вы сейчас будете Select * делать.
Потом получите "конец всего сущего".
Начнете отслеживать и регистрировать номера сообщений.
Напишите велосипед :-)
ИИИиии....
Получите тот же deadlock из за косяка в коде конфы.
49 vi0
 
03.03.15
14:22
(43) транзакция обеспечивает согласованность данных
читай статью по транзациям
50 Necessitudo
 
03.03.15
14:24
(48) Расскажи нам про реструктуризацию таблиц при изменении метаданных:)
51 vi0
 
03.03.15
14:27
вот посмотри, там по планам обмена есть немного
http://www.ravepoint.narod.ru/aticles/tecnology/2methodics/2_4.htm
52 Black Dragon
 
03.03.15
14:28
(49) ну ваааще...
я не про согласованность данных в рамках одной транзакции говорил, а про согласованность данных у разных транзакций, т.к. пакеты пронумерованы в строго хронологическом порядке, то и рассогласования не можеть возникать! нужно лишь контролировать номера получаемых сообщений и не пропустить пакет!
53 Black Dragon
 
03.03.15
14:28
(51) благодарю, сейчас почитаю
54 Black Dragon
 
03.03.15
14:32
Вот и подтверждение моих логических предположений:

Выгрузка изменений во время работы пользователей

Выгрузка изменений по плану обмена включает в себя этап считывания всех измененных записей из таблицы регистрации изменений. Запрос, выполняемый в транзакции, отрабатывает условие "все измененные объекты данного типа", поэтому на время работы транзакции блокируется возможность регистрации новых изменений для объектов данного типа. Это означает, что во время выгрузки изменений другие пользователи не смогут вносить новые изменения в объекты данного типа. Если к моменты выгрузки было зарегистрировано большое количество изменений, то выгрузка может занимать значительное время, что может привести к существенному снижению общей пропускной способности системы, появлению ошибок типа таймаут и т.п.
Для исключения этих блокировок рекомендуется осуществлять массивные выгрузки данных в моменты минимальной загрузки системы, например, в ночное время. Другое возможное решение проблемы - делать выгрузки достаточно часто. В этом случае объем выгружаемых данных будет незначительным, выгрузка будет осуществляться быстро и не окажет существенного влияния на работу других пользователей
55 vi0
 
03.03.15
15:03
(52) насчет несогласованных данных действительно не очень понятно
обычно термин "несогласованные данные" подразумевает ошибочное состояние базы
не может же платформа давать инструмент (параметр ЭлементовВТранзакции), который будет провоцировать на ошибки в данных
ты пишешь про несогласованные данные у разных транзакций, но в СП не так написано (то что ты процитировал выше)

скорее всего под несогласованностью здесь имеется ввиду разные данные в узлах обмена, когда уже выгруженные данные изменились, пока выгрузка продолжалась, и что потребуется повторная выгрузка
т.е. не ошибочная а штатная ситуация
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой