Конфликт блокировок при выполнении транзакции: Неустранимый конфликт блокировок
Написал вот такой код. Прошу не ругать (смотрите на аватар)
Запускаю, и до конца не отрабатывает, получаю следующую ошибку:
Каждый раз видимо на разных объектах, так как выводимый список исправленных объектов разный.
Подскажите, не могу понять. где в коде накосячил.
ЗЫ. УТ11.3/SQL2012
&НаКлиенте
Процедура Тык(Команда)
ТыкНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ТыкНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Валюты.Ссылка,
| Валюты.ПометкаУдаления
|ИЗ
| Справочник.Валюты КАК Валюты";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.ПометкаУдаления Тогда
НеправильнаяВалюта = ВыборкаДетальныеЗаписи.Ссылка;
Иначе
ПравильнаяВалюта = ВыборкаДетальныеЗаписи.Ссылка;
КонецЕсли;
КонецЦикла;
МассивСсылка = Новый Массив;
МассивСсылка.Добавить(НеправильнаяВалюта);
ТабСсылок = НайтиПоСсылкам(МассивСсылка);
Первые10 = 0;
Для Каждого Ссылка из ТабСсылок Цикл
Попытка //получить объект
ОбъектПоССылке = Ссылка[1].ПолучитьОбъект();
Исключение
//Не объектный тип данных просто пропустим
Продолжить;
КонецПопытки;
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ОбъектПоССылке));
КоллекцияРеквизитов = ОбъектМетаданных.Реквизиты;
Для Каждого Реквизит Из КоллекцияРеквизитов Цикл
Если ОбъектПоССылке[Реквизит.Имя] = НеправильнаяВалюта Тогда
ОбъектПоССылке[Реквизит.Имя] = ПравильнаяВалюта;
КонецЕсли;
КонецЦикла;
НачатьТранзакцию();
Если НЕ ОбъектПоССылке.ПометкаУдаления Тогда //Непомеченный на удаление объект
//Определим является ли объект документом
Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
ЭтоДокумент = Истина;
Иначе
ЭтоДокумент = Ложь;
КонецЕсли;
Если ЭтоДокумент Тогда
Если ОбъектПоССылке.Проведен Тогда
ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);
ОбъектПоССылке.Записать(РежимЗаписиДокумента.Проведение);
Иначе
ОбъектПоССылке.Записать();
КонецЕсли;
Иначе
ОбъектПоССылке.Записать();
КонецЕсли;
Иначе //Помеченные на удаление объекты просто перезаписываем.
//Может и не надо 2 раза записывать, я хз. На всякий.
ОбъектПоССылке.Записать();
ОбъектПоССылке.УстановитьПометкуУдаления(Ложь);
ОбъектПоССылке.Записать();
ОбъектПоССылке.УстановитьПометкуУдаления(Истина);
ОбъектПоССылке.Записать();
КонецЕсли;
ЗафиксироватьТранзакцию();
Сообщить ("" + СокрЛП(Ссылка[0]) + " " + СокрЛП(Ссылка[1]));
//Первые10 = Первые10 + 1;
//Если Первые10 >1000 Тогда
// Прервать;
//КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьЗапускаю, и до конца не отрабатывает, получаю следующую ошибку:
{ВнешняяОбработка.ИсправлениеВалют.Форма.Форма.Форма(64)}: Ошибка при вызове метода контекста (Записать)
ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);
по причине:
Конфликт блокировок при выполнении транзакции:
Неустранимый конфликт блокировок
ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);
по причине:
Конфликт блокировок при выполнении транзакции:
Неустранимый конфликт блокировок
Каждый раз видимо на разных объектах, так как выводимый список исправленных объектов разный.
Подскажите, не могу понять. где в коде накосячил.
ЗЫ. УТ11.3/SQL2012
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
За "ТыкНаСервере" поубивав бы...
Хорошо бы конечно ещё увидеть код ОтменыПроведения. А так же техжурнал по deadlock-ам.
Но, возможно, будет достаточно просто убрать строку: "ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);"
Хорошо бы конечно ещё увидеть код ОтменыПроведения. А так же техжурнал по deadlock-ам.
Но, возможно, будет достаточно просто убрать строку: "ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);"
(4) Про "ТыкНаСервере" согласен. Уже получал тут на форуме "по шапке" за это. Но обработка как бы на один раз. Исправить валюты и забыть. Но исправлюсь, обещаю.
Немного не понял. Какой код вы имели ввиду? Если вы про обработку проведения, то это УТ11.3 на полной поддержке.
Не умею пока собирать.
а может такое быть из-за того, что я пытаюсь снять с проведения документ, который уже ранее изменил. Ща попробую его сначала .записать()
Хорошо бы конечно ещё увидеть код ОтменыПроведения.
Немного не понял. Какой код вы имели ввиду? Если вы про обработку проведения, то это УТ11.3 на полной поддержке.
А так же техжурнал по deadlock-ам.
Не умею пока собирать.
Но, возможно, будет достаточно просто убрать строку: "ОбъектПоССылке.Записать(РежимЗаписиДокумента.ОтменаПроведения);"
а может такое быть из-за того, что я пытаюсь снять с проведения документ, который уже ранее изменил. Ща попробую его сначала .записать()
(6) Задачей стоит удаление неправильной валюты из базы и замены её на верную. Но на неё ссылки у ~15к объектов. В том числе в различных регистрах. И скажем, документ может быть помечен на удаление, но движения в некоторых регистрах со ссылкой на него есть. Насколько мне хватило ума - помогает только снятие пометки на удаление, запись и повторная установка пометки на удаление. Ну и по аналогии для проведенных документов решил сделать. Перепроведение, как мне показалось, не всегда приводит к полному очищение старых движений.
(8) Не уверен, что это можно использовать. по крайне мере, не понимаю как это сделать.
Ситуация следующая. Кто-то еще на старте базы поставил галку несколько валют, завел туда новую валюту - еще один рубль. потом эту галку на каком-то этапе убрали. Я вообще не знал о существовании второй валюты, пока не начал обновляться и получил ошибку не заданного курса валют. Причем обновления между 11.3 релизами проходили корректно, а вот на 11.4 - с ошибкой. Открыл валюты. Там галка снята с "несколько валют". Открываю валюты - получаю форму элемента валюты RUR. Все ок. Потом решил все же поставить галку и увидел эту ситуацию. Пометил на удаление неправильный элемент. Хотел удалить, но на неё более 15 тыс. ссылок (на правильной валюте около 21). Посмотрел поиск и замену дублей и что-то не сообразил как её использовать. Тут теоретически больше подходит групповое изменение реквизитов. Но валюта ссылается на множество разных объектов, поэтому мне показалось легче написать обработку, чем руками выбирать разные типы метаданных в этой обработке.
Ситуация следующая. Кто-то еще на старте базы поставил галку несколько валют, завел туда новую валюту - еще один рубль. потом эту галку на каком-то этапе убрали. Я вообще не знал о существовании второй валюты, пока не начал обновляться и получил ошибку не заданного курса валют. Причем обновления между 11.3 релизами проходили корректно, а вот на 11.4 - с ошибкой. Открыл валюты. Там галка снята с "несколько валют". Открываю валюты - получаю форму элемента валюты RUR. Все ок. Потом решил все же поставить галку и увидел эту ситуацию. Пометил на удаление неправильный элемент. Хотел удалить, но на неё более 15 тыс. ссылок (на правильной валюте около 21). Посмотрел поиск и замену дублей и что-то не сообразил как её использовать. Тут теоретически больше подходит групповое изменение реквизитов. Но валюта ссылается на множество разных объектов, поэтому мне показалось легче написать обработку, чем руками выбирать разные типы метаданных в этой обработке.
Если наименования валют одинаковые, то используй стандартную обработку по замене дублей. Там все просто. Выбрать нужный справочник, валюты в в твоем случае, и отобрать совпадающие по наименованию. Перед этим лучше грохнуть все курсы в регистре сведений по валюте, которую надо удалить.
(10) Да ё-мае! Я думал, у неё функционал на уровне - нашел 2 одинаковых поставщика и дальше сам удаляй. Сейчас вот решил до конца её попробовать, а она еще все ссылки показала, ну значит наверное их поправит - шикарно. Запустил, жду.
Что я сразу умным людям не верю? (Это я к (8))
Что я сразу умным людям не верю? (Это я к (8))
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот