Имя: Пароль:
1C
 
Откат транзакции идет очень медленно - SQL 2017
0 RomaH
 
naïve
04.07.19
09:20
Документ на 2000 строк
соответственно записей в РС столько же
ошибка - дублирование записи - и откат транзакции минут на 30 с блокировкой всей таблицы РС,
если набор без ошибок - запись за пару секунд

началось после переезда с SQL 2008 на 2017

что настроить?
1 Cyberhawk
 
04.07.19
09:22
Не допускать дублирование (надежную проверку до начала записи) сделать не предлагать?
2 RomaH
 
naïve
04.07.19
09:25
3 RomaH
 
naïve
04.07.19
09:25
(1) хотелось бы понять почему так
можно словить аналогичную на других записях
4 vicof
 
04.07.19
09:26
А запись случайно не с помощью менеджеразаписи идет?
5 RomaH
 
naïve
04.07.19
09:28
(4) в (0) наврал
основной набор записывается набором
но есть небольшие таблицы которые пишу менеджерами

э-эх


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    //Если ВидДокумента = Перечисления.ВидыДокументовИзмененияСписковЗастрахованных.ОбновлениеСписков Тогда
    
    //Документы.СпискиПолисов.СопоставитьЗастрахованныхИПолисы(Ссылка);
    
    Если ЗначениеЗаполнено(ПерерассчитываемыйДокумент) Тогда
        
        НаборЗаписей = РегистрыСведений.НомерникПолисов.СоздатьНаборЗаписей();
        
        НаборЗаписей.Отбор.Регистратор.Установить(ПерерассчитываемыйДокумент);
        
        //НаборЗаписей.Прочитать();
        
        НаборЗаписей.Записать();
        
    КонецЕсли;
    
    Если ВидДокумента = Перечисления.ВидыДокументовИзмененияСписковЗастрахованных.УдалениеСписков Тогда
        Возврат;
    КонецЕсли;
    
    //Если Ложь Тогда
        
        Запрос = Новый Запрос;
        
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗагрузкаНомерникаСоответствиеМестРаботы.МестоРаботыСсылка,
        |    ЗагрузкаНомерникаСоответствиеМестРаботы.Ссылка.СтраховаяОрганизация КАК Страховщик,
        |    ЗагрузкаНомерникаСоответствиеМестРаботы.Ссылка.Договор,
        |    ЗагрузкаНомерникаСоответствиеМестРаботы.Ссылка.ВидСтрахования,
        |    НАЧАЛОПЕРИОДА(ЗагрузкаНомерникаСоответствиеМестРаботы.Ссылка.Дата, ДЕНЬ) КАК Дата,
        |    ЗагрузкаНомерникаСоответствиеМестРаботы.Ссылка
        |ПОМЕСТИТЬ втМестаРаботы
        |ИЗ
        |    Документ.СпискиПолисов.СоответствиеМестРаботы КАК ЗагрузкаНомерникаСоответствиеМестРаботы
        |ГДЕ
        |    ЗагрузкаНомерникаСоответствиеМестРаботы.Ссылка = &Ссылка
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    НомерникПолисов.Регистратор,
        |    ВЫБОР КОГДА НомерникПолисов.Период < втМестаРаботы.Дата ТОГДА Истина ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ПредыдущаяЗапись,
        |    НомерникПолисов.МестоРаботыСсылка,
        |    НомерникПолисов.Договор,
        |    НомерникПолисов.Страховщик,
        |    НомерникПолисов.ВидСтрахования
        |ИЗ
        |    втМестаРаботы КАК втМестаРаботы
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НомерникПолисов КАК НомерникПолисов
        |        ПО втМестаРаботы.МестоРаботыСсылка = НомерникПолисов.МестоРаботыСсылка
        |            И втМестаРаботы.Страховщик = НомерникПолисов.Страховщик
        |            И втМестаРаботы.Договор = НомерникПолисов.Договор
        |            И втМестаРаботы.ВидСтрахования = НомерникПолисов.ВидСтрахования
        |            И втМестаРаботы.Ссылка <> НомерникПолисов.Регистратор";
        
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        
        ВыборкаМестРаботы = Запрос.Выполнить().Выбрать();
        
        МассивМестРаботыПоКоторымНеНужныДвижения = Новый Массив;
        
        Пока ВыборкаМестРаботы.Следующий() Цикл
            
            Если ВыборкаМестРаботы.Регистратор = Null Тогда //Записей похожих нет
                Продолжить;
            КонецЕсли;
            
            Если ВыборкаМестРаботы.ПредыдущаяЗапись Тогда
                
                НаборЗаписей = РегистрыСведений.НомерникПолисов.СоздатьНаборЗаписей();
                
                НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаМестРаботы.Регистратор);
                
                НаборЗаписей.Прочитать();
                
                ТаблицаДвижений = НаборЗаписей.Выгрузить();
                
                МассивСтрокКУдалению = ТаблицаДвижений.НайтиСтроки(Новый Структура("МестоРаботыСсылка",ВыборкаМестРаботы.МестоРаботыСсылка));
                
                Для Каждого СтрокаТЧ Из МассивСтрокКУдалению Цикл
                    ТаблицаДвижений.Удалить(СтрокаТЧ);
                КонецЦикла;
                
                НаборЗаписей.Загрузить(ТаблицаДвижений);
                
                НаборЗаписей.Записать();
                
            Иначе
                МассивМестРаботыПоКоторымНеНужныДвижения.Добавить(ВыборкаМестРаботы.МестоРаботыСсылка);
            КонецЕсли;
            
        КонецЦикла;
        
    //КонецЕсли;    
        
    //КонецЕсли;
    
    Для Каждого СтрокаТЧ Из СписокЗастрахованых Цикл
        
        МестоРаботыСсылка = СоответствиеМестРаботы.Найти(СтрокаТЧ.МестоРаботы).МестоРаботыСсылка;
        
        ПрограммаСтрахованияСсылка = СоответствиеПрограммСтрахования.Найти(СтрокаТЧ.ПрограммаСтрахования);
        
        Если ПрограммаСтрахованияСсылка <> Неопределено Тогда
            ПрограммаСтрахованияСсылка = ПрограммаСтрахованияСсылка.ПрограммаСтрахованияСсылка;
        КонецЕсли;
        
        Если Не ЗначениеЗаполнено(ПрограммаСтрахованияСсылка) И ТипЗнч(ИдентификаторСписка) = Тип("СправочникСсылка.СпискиЗастрахованных") Тогда
            ПрограммаСтрахованияСсылка = ИдентификаторСписка.ПрограммаСтрахования;    
        КонецЕсли;
        
        Если ВидДокумента = Перечисления.ВидыДокументовИзмененияСписковЗастрахованных.ОбновлениеСписков И МассивМестРаботыПоКоторымНеНужныДвижения.Найти(МестоРаботыСсылка) <> Неопределено Тогда
            Продолжить;
        КонецЕсли;
        
        ЗаписьНомерника = Движения.НомерникПолисов.Добавить();
        
        //Измерения
        ЗаписьНомерника.Период                 = НачалоДня(Дата);
        ЗаписьНомерника.ВидСтрахования        = ВидСтрахования;
        ЗаписьНомерника.Страховщик             = СтраховаяОрганизация;
        ЗаписьНомерника.МестоРаботыСсылка     = МестоРаботыСсылка;
        ЗаписьНомерника.Договор             = Договор;
        ЗаписьНомерника.НомерПолиса         = СтрокаТЧ.Номер;
        ЗаписьНомерника.СерияПолиса         = СтрокаТЧ.Серия;
        
        //Ресурсы
        ЗаписьНомерника.Фамилия         = СтрокаТЧ.Фамилия;
        ЗаписьНомерника.Имя             = СтрокаТЧ.Имя;
        ЗаписьНомерника.Отчество         = СтрокаТЧ.Отчество;
        ЗаписьНомерника.ДатаРождения     = СтрокаТЧ.ДатаРождения;
        ЗаписьНомерника.ДатаНачала         = СтрокаТЧ.ДатаНачала;
        ЗаписьНомерника.ДатаОкончания     = СтрокаТЧ.ДатаОкончания;
        ЗаписьНомерника.СНИЛС             = СтрокаТЧ.СНИЛС;
        ЗаписьНомерника.МестоРаботы     = СтрокаТЧ.МестоРаботы;
        
        ЗаписьНомерника.ПрограммаСтрахования = ПрограммаСтрахованияСсылка;
        
    КонецЦикла;
    
    Движения.НомерникПолисов.Записывать = Истина;
    
    ЗаписатьСоответсвиеСтроковыхПредставленийСМО();
    
КонецПроцедуры

Процедура ЗаписатьСоответсвиеСтроковыхПредставленийСМО() Экспорт
    
    Для Каждого СтрокаТЧ Из СоответствиеМестРаботы Цикл
        
        Если Не ЗначениеЗаполнено(СтрокаТЧ.МестоРаботыСсылка) Тогда
            Продолжить;
        КонецЕсли;
        
        Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
        
        Хеш.Добавить(СтрокаТЧ.МестоРаботы);
        
        Запись = РегистрыСведений.СоответствиеСтроковыхПредставленийСМО.СоздатьМенеджерЗаписи();
        
        Запись.СтраховаяОрганизация = СтраховаяОрганизация;
        Запись.ХэшСтроки = Хеш.ХешСумма;
        
        Запись.МестоРаботы = СтрокаТЧ.МестоРаботыСсылка;
        
        Запись.Записать();
        
    КонецЦикла;
    
    Для Каждого СтрокаТЧ Из СоответствиеПрограммСтрахования Цикл
        
        Если Не ЗначениеЗаполнено(СтрокаТЧ.ПрограммаСтрахованияСсылка) Тогда
            Продолжить;
        КонецЕсли;
        
        Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
        
        Хеш.Добавить(СтрокаТЧ.ПрограммаСтрахования);
        
        Запись = РегистрыСведений.СоответствиеСтроковыхПредставленийСМО.СоздатьМенеджерЗаписи();
        
        Запись.СтраховаяОрганизация = СтраховаяОрганизация;
        Запись.ХэшСтроки = Хеш.ХешСумма;
        
        Запись.ПрограммаСтрахования = СтрокаТЧ.ПрограммаСтрахованияСсылка;
        
        Запись.Записать();
        
    КонецЦикла;
    
КонецПроцедуры

6 RomaH
 
naïve
04.07.19
09:30
еще раз акцентирую:

на 2008 серевере долгого отката не наблюдалось - проблема появилась после переtзда на новый сервер (железо, ось, SQL)
7 yavasya
 
04.07.19
09:31
(4) Бро, а менеджер записи если не ошибаюсь блокирует всю таблицу , а набор это управляемая блокировка?
8 RomaH
 
naïve
04.07.19
09:34
режим управления блокировкой для конфы - управляемый
для РС тоже

попробую менеджеры убрать..
9 yavasya
 
04.07.19
09:34
(5) так ты набор в цикле записываешь, поэтому. А зачем тебе все раздувать в одну транзакцию ? небось еще по РН делает движения и под другим таблицам. Сделай после записи подписку на событие.
10 yavasya
 
04.07.19
09:35
(8) если упп, то в совместимости, хз, какая конфа?
11 RomaH
 
naïve
04.07.19
09:35
(10) БСП
12 yavasya
 
04.07.19
09:40
(11) библиотека стандартных подсистем?)
13 RomaH
 
naïve
04.07.19
09:40
(9) я уточню - но код с записью набора в цикле устаревший и уже по условию не выполняется

       Пока ВыборкаМестРаботы.Следующий() Цикл
            
            Если ВыборкаМестРаботы.Регистратор = Null Тогда//Записей похожих нет

                Продолжить;
            КонецЕсли;
            
            Если ВыборкаМестРаботы.ПредыдущаяЗапись Тогда
                
                НаборЗаписей = РегистрыСведений.НомерникПолисов.СоздатьНаборЗаписей();
                
                НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаМестРаботы.Регистратор);
                
                НаборЗаписей.Прочитать();
                
                ТаблицаДвижений = НаборЗаписей.Выгрузить();
                
                МассивСтрокКУдалению = ТаблицаДвижений.НайтиСтроки(Новый Структура("МестоРаботыСсылка",ВыборкаМестРаботы.МестоРаботыСсылка));
                
                Для Каждого СтрокаТЧ Из МассивСтрокКУдалению Цикл
                    ТаблицаДвижений.Удалить(СтрокаТЧ);
                КонецЦикла;
                
                НаборЗаписей.Загрузить(ТаблицаДвижений);
                
                НаборЗаписей.Записать();
                
            Иначе
                МассивМестРаботыПоКоторымНеНужныДвижения.Добавить(ВыборкаМестРаботы.МестоРаботыСсылка);
            КонецЕсли;
            
        КонецЦикла;


либо просто в цикл не заходит, либо null

       Пока ВыборкаМестРаботы.Следующий() Цикл
            
            Если ВыборкаМестРаботы.Регистратор = Null Тогда//Записей похожих нет

                Продолжить;
            КонецЕсли;



но еще раз - скорость записи меня устраивает
вопрос - почему откат транзакции стал долгим


пользователь жмет "провести" через 3 секунды получает отказ по причине дублирования
открывает другой док - и на нем получает блокировку - в соединениях висит
Захвачено СУБД 1 500 000
профайлер выше
14 RomaH
 
naïve
04.07.19
09:40
(12) да - это самописка
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.