|
Ошибка при обмене: конфликт блокировок | ☑ | ||
---|---|---|---|---|
0
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 куда копать ? |
|||
1
zak555
20.03.19
✎
12:28
|
ругается на РС кэш программных интерфейсов
|
|||
2
zak555
20.03.19
✎
12:45
|
какой-то код странный
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТаблицаКэша.ДатаОбновления КАК ДатаОбновления, | ТаблицаКэша.Данные КАК Данные, | ТаблицаКэша.ТипДанных КАК ТипДанных |ИЗ | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша |ГДЕ | ТаблицаКэша.Идентификатор = &Идентификатор | И ТаблицаКэша.ТипДанных = &ТипДанных"; Идентификатор = Идентификатор; Запрос.УстановитьПараметр("Идентификатор", Идентификатор); Запрос.УстановитьПараметр("ТипДанных", ТипДанных); НачатьТранзакцию(); ОшибкаУстановкиБлокировки = Ложь; Попытка СтруктураКлюча = Новый Структура("Идентификатор, ТипДанных", Идентификатор, ТипДанных); Ключ = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьКлючЗаписи(СтруктураКлюча); Попытка ЗаблокироватьДанныеДляРедактирования(Ключ); Исключение // Данные уже обновляются из другого сеанса ОшибкаУстановкиБлокировки = Истина; ВызватьИсключение; КонецПопытки; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов"); ЭлементБлокировки.УстановитьЗначение("Идентификатор", Идентификатор); ЭлементБлокировки.УстановитьЗначение("ТипДанных", ТипДанных); Блокировка.Заблокировать(); Результат = Запрос.Выполнить(); // Убедимся что данные требуют обновления Если НЕ Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Выборка.Следующий(); Если НЕ ЗаписьКэшаВерсийУстарела(Выборка) Тогда // Данные актуальны ОтменитьТранзакцию(); Возврат; КонецЕсли; КонецЕсли; Набор = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей(); Набор.Отбор.Идентификатор.Установить(Идентификатор); Набор.Отбор.ТипДанных.Установить(ТипДанных); Запись = Набор.Добавить(); Запись.Идентификатор = Идентификатор; Запись.ТипДанных = ТипДанных; Запись.ДатаОбновления = ТекущаяУниверсальнаяДата(); Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Данные = ПодготовитьДанныеКэшаВерсий(ТипДанных, ПараметрыПолучения); Запись.Данные = Новый ХранилищеЗначения(Данные); Иначе Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения); КонецЕсли; Набор.Записать(); ЗафиксироватьТранзакцию(); |
|||
3
zak555
20.03.19
✎
12:45
|
создали уже запись , потом пытаюсь ещё раз записать с теми же ключами
|
|||
4
GreyK
20.03.19
✎
12:58
|
(0) Предупреждений по синхронизации нет?
|
|||
5
zak555
20.03.19
✎
13:13
|
даже при попытке проверить подключение такая же ошибка
|
|||
6
zak555
20.03.19
✎
13:25
|
какая логика в коде из 2 ?
|
|||
7
aleks_default
20.03.19
✎
13:42
|
(6)Дату обновления меняют
|
|||
8
aleks_default
20.03.19
✎
13:44
|
Хотя код конечно говно
|
|||
9
aleks_default
20.03.19
✎
13:49
|
Транзакцию отменять надо если результат запроса пустой, если попытка блокировки не удалась(хотя зачем она здесь ума не приложу). А здесь ее фиксируют в конце вне зависимости от результата записи Вот тебе ошибки ожидания заверщения транзакции и выдает
|
|||
10
aleks_default
20.03.19
✎
13:51
|
Если ПодготовитьДанныеКэшаВерсий никаких записей в базу данных не делает, то транзакция здесь вообще нахер не нужна
|
|||
11
zak555
20.03.19
✎
13:56
|
сейчас в РС всё пусто
|
|||
12
zak555
20.03.19
✎
13:59
|
(10) есть данные
|
|||
13
zak555
20.03.19
✎
14:04
|
Ключ = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьКлючЗаписи(СтруктураКлюча);
уже создаёт запись без ХЗ, которую блокирует |
|||
14
aleks_default
20.03.19
✎
14:04
|
Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения);
Загляни в модуль набора записей регистра. Видимо там еще какая-то обработка делается перед записью набора. Может там зависает. |
|||
15
aleks_default
20.03.19
✎
14:05
|
(14)Или подписка
|
|||
16
aleks_default
20.03.19
✎
14:08
|
(13)Это не запись в базу данных, это ключ записи, которая еще не записана. Типа как объект документа.
|
|||
17
zak555
20.03.19
✎
14:09
|
(16) данные пишет, но не фиксирует транзакцию
|
|||
18
zak555
20.03.19
✎
14:13
|
(14)
Процедура ПередЗаписью(Отказ, Замещение) // Проверка значения свойства ОбменДанными.Загрузка отсутствует по причине того, что ограничения, // накладываемые данным кодом, не должны обходить установкой этого свойства равным Истина // (на стороне кода, который выполняет попытку записи в данный регистр). // // Данный регистр не должен входить в любые обмены или операции выгрузки / загрузки данных при включенном // разделении по областям данных. ТребуетсяКонтроль = ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); Если ТребуетсяКонтроль Тогда ПараметрыПолучения = Неопределено; Если Не ДополнительныеСвойства.Свойство("ПараметрыПолучения", ПараметрыПолучения) Тогда ВызватьИсключение НСтр("ru = 'При записи данных в регистр сведений КэшПрограммныхИнтерфейсов из сеансов |с включенным разделением требуется передавать параметры получения данных для кэша |интерфейсов в дополнительном свойстве набора записей ПараметрыПолучения!'"); КонецЕсли; Для Каждого Запись Из ЭтотОбъект Цикл Данные = ОбщегоНазначения.ПодготовитьДанныеКэшаВерсий( Запись.ТипДанных, ПараметрыПолучения); Запись.Данные = Новый ХранилищеЗначения(Данные); КонецЦикла; ТаблицаКонтроля = ЭтотОбъект.Выгрузить(); КонецЕсли; КонецПроцедуры |
|||
19
zak555
20.03.19
✎
14:59
|
закоментил всё, что связано с транзакциями -- в РС появились записи
|
|||
20
zak555
20.03.19
✎
15:00
|
теперь новая беда
в базе Бух 3.0 не найдена настройка с узлом УТ |
|||
21
zak555
20.03.19
✎
15:00
|
в УТ же нет РС псевдонимы узлов
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |