Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Ошибка при обмене: конфликт блокировок

Ошибка при обмене: конфликт блокировок
Я
   zak555
 
20.03.19 - 12:19
есть база ут 10.3.50.3 под sql
есть БП во фрещше

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

Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 11.0: Превышено время ожидания запроса на блокировку.
HRESULT=80040E31, SQLSrvr: SQLSTATE=HYT00, state=31, Severity=10, native=1222, line=1

куда копать ?
 
 
   zak555
 
1 - 20.03.19 - 12:28
ругается на РС кэш программных интерфейсов
   zak555
 
2 - 20.03.19 - 12:45
какой-то код странный


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

            ОшибкаУстановкиБлокировки = Истина;
            ВызватьИсключение;
        КонецПопытки;
        
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов");
        ЭлементБлокировки.УстановитьЗначение("Идентификатор", Идентификатор);
        ЭлементБлокировки.УстановитьЗначение("ТипДанных", ТипДанных);
        Блокировка.Заблокировать();
        
        Результат = Запрос.Выполнить();
        
        // Убедимся что данные требуют обновления

        Если НЕ Результат.Пустой() Тогда
            Выборка = Результат.Выбрать();
            Выборка.Следующий();
            Если НЕ ЗаписьКэшаВерсийУстарела(Выборка) Тогда
                // Данные актуальны

                ОтменитьТранзакцию();
                Возврат;
            КонецЕсли;
        КонецЕсли;
        
        Набор = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей();
        
        Набор.Отбор.Идентификатор.Установить(Идентификатор);
        Набор.Отбор.ТипДанных.Установить(ТипДанных);
        
        Запись = Набор.Добавить();
        Запись.Идентификатор = Идентификатор;
        Запись.ТипДанных = ТипДанных;
        Запись.ДатаОбновления = ТекущаяУниверсальнаяДата();
        
        Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
        
            Данные = ПодготовитьДанныеКэшаВерсий(ТипДанных, ПараметрыПолучения);
            Запись.Данные = Новый ХранилищеЗначения(Данные);
            
        Иначе
            
            Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения);
            
        КонецЕсли;
        
        Набор.Записать();
        
        ЗафиксироватьТранзакцию();
   zak555
 
3 - 20.03.19 - 12:45
создали уже запись , потом пытаюсь ещё раз записать с теми же ключами
   GreyK
 
4 - 20.03.19 - 12:58
(0) Предупреждений по синхронизации нет?
   zak555
 
5 - 20.03.19 - 13:13
даже при попытке проверить подключение такая же ошибка
   zak555
 
6 - 20.03.19 - 13:25
какая логика в коде из 2 ?
   aleks_default
 
7 - 20.03.19 - 13:42
(6)Дату обновления меняют
   aleks_default
 
8 - 20.03.19 - 13:44
Хотя код конечно говно
   aleks_default
 
9 - 20.03.19 - 13:49
Транзакцию отменять надо если результат запроса пустой, если попытка блокировки не удалась(хотя зачем она здесь ума не приложу). А здесь ее фиксируют в конце  вне зависимости от результата записи Вот тебе ошибки ожидания заверщения транзакции и выдает
   aleks_default
 
10 - 20.03.19 - 13:51
Если ПодготовитьДанныеКэшаВерсий никаких записей в базу данных не делает, то транзакция здесь вообще нахер не нужна
   zak555
 
11 - 20.03.19 - 13:56
сейчас в РС всё пусто
   zak555
 
12 - 20.03.19 - 13:59
(10) есть данные
   zak555
 
13 - 20.03.19 - 14:04
Ключ = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьКлючЗаписи(СтруктураКлюча);

уже создаёт запись без ХЗ, которую блокирует
   aleks_default
 
14 - 20.03.19 - 14:04
Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения);
Загляни в модуль набора записей регистра. Видимо там еще какая-то обработка делается перед записью набора. Может там зависает.
   aleks_default
 
15 - 20.03.19 - 14:05
(14)Или подписка
   aleks_default
 
16 - 20.03.19 - 14:08
(13)Это не запись в базу данных, это ключ записи, которая еще не записана. Типа как объект документа.
   zak555
 
17 - 20.03.19 - 14:09
(16) данные пишет, но не фиксирует транзакцию
   zak555
 
18 - 20.03.19 - 14:13
(14)

Процедура ПередЗаписью(Отказ, Замещение)
    
    // Проверка значения свойства ОбменДанными.Загрузка отсутствует по причине того, что ограничения,

    // накладываемые данным кодом, не должны обходить установкой этого свойства равным Истина

    // (на стороне кода, который выполняет попытку записи в данный регистр).

    //

    // Данный регистр не должен входить в любые обмены или операции выгрузки / загрузки данных при включенном

    // разделении по областям данных.

    
    ТребуетсяКонтроль = ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных();
    
    Если ТребуетсяКонтроль Тогда
        
        ПараметрыПолучения = Неопределено;
        Если Не ДополнительныеСвойства.Свойство("ПараметрыПолучения", ПараметрыПолучения) Тогда
            
            ВызватьИсключение НСтр("ru = 'При записи данных в регистр сведений КэшПрограммныхИнтерфейсов из сеансов 
                                    |с включенным разделением требуется передавать параметры получения данных для кэша
                                    |интерфейсов в дополнительном свойстве набора записей ПараметрыПолучения!'");
            
        КонецЕсли;
        
        Для Каждого Запись Из ЭтотОбъект Цикл
            
            Данные = ОбщегоНазначения.ПодготовитьДанныеКэшаВерсий(
                Запись.ТипДанных, ПараметрыПолучения);
            Запись.Данные = Новый ХранилищеЗначения(Данные);
            
        КонецЦикла;
        
        ТаблицаКонтроля = ЭтотОбъект.Выгрузить();
        
    КонецЕсли;
    
КонецПроцедуры
   zak555
 
19 - 20.03.19 - 14:59
закоментил всё, что связано с транзакциями -- в РС появились записи
   zak555
 
20 - 20.03.19 - 15:00
теперь новая беда
в базе Бух 3.0 не найдена настройка с узлом УТ
   zak555
 
21 - 20.03.19 - 15:00
в УТ же нет РС псевдонимы узлов


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.