|
НачатьТранзакцию() в управляемом режиме блокировок | ☑ | ||
---|---|---|---|---|
0
noxxx
17.01.13
✎
17:51
|
Господа-товарищи! Есть вопрос.
Имеется обработка, которая загружает нечто из xml-файла в базу УПП. Запись каждого объекта ведется в два этапа: запись самого объекта и запись идентификатора внешней базы в регистр сведений. Соответственно, если запись элемента или идентификатора не удалась, то надо откатить обе записи. Поэтому запись каждого элемента обернули в НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Проблема в том, что элементов много (несколько десятков, иногда сотни тысяч), загрузка длится около 3 минут, и пока эта вакханалия продолжается, почему-то нельзя зайти в элемент справочника "Номенклатура", записать заказ покупателя и т.п. Отсюда вопросы: 1. Как НачатьТранзакцию() определяет что именно ей блокировать 2. Как ей указать что именно блокировать 3. Почему попытка проведения документа не пролетает в паузу между записями элементов этой нашей обработкой? |
|||
1
noxxx
17.01.13
✎
17:52
|
Запись не каждого элемента, а запись каждой пары.
|
|||
2
ProgAL
17.01.13
✎
18:09
|
Попробуй ПриЗаписи элемента справочника в модуле объекта создавать запись в регистре сведений в попытке. Если внутри попытки исключение отказ = истина. По смыслу все откатится.
|
|||
3
noxxx
17.01.13
✎
23:54
|
up
|
|||
4
noxxx
18.01.13
✎
10:37
|
ап-ап-ап
|
|||
5
noxxx
18.01.13
✎
10:38
|
(2) Эти две записи связаны между собой только в обработке, а в обычной жизни в ПриЗаписи элемента ссылка не пишется.
|
|||
6
stonewolf
18.01.13
✎
10:50
|
(0) почему-то нельзя зайти в элемент справочника "Номенклатура"
------------- Неправильно или вообще не наложена блокировка. Как НачатьТранзакцию() определяет что именно ей блокировать ------------- БлокировкаДанных (DataLock) Элементы коллекции: ЭлементБлокировкиДанных Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы блокировки. Возможно обращение к элементам блокировки посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0). Методы: Добавить (Add) Заблокировать (Lock) Количество (Count) Получить (Get) Конструкторы: По умолчанию Описание: Предназначен для явной блокировки данных от чтения или изменения другими сессиями. |
|||
7
ProgAL
18.01.13
✎
21:58
|
Попробуй такой код по аналогии из БСП.
НачатьТранзакцию(); Попытка Об = Справочники.Организации.СоздатьЭлемент(); Об.Наименование = "" + ТекущаяДата(); Об.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.Организации"); ЭлементБлокировки.УстановитьЗначение("Ссылка", Об.Ссылка); Блокировка.Заблокировать(); МенеджерЗаписи = РегистрыСведений.КлючВоВнешнейБД.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Объект = Об.Ссылка; МенеджерЗаписи.Прочитать(); МенеджерЗаписи.Объект = Об.Ссылка; МенеджерЗаписи.ИД = "555"; МенеджерЗаписи.Записать(); ааа = 1/0; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ВызватьИсключение; Сообщить("" + ОписаниеОшибки()); КонецПопытки; |
|||
8
Armando
18.01.13
✎
22:38
|
(0) точно что вся загрузка не выполняется в какой-то другой транзакции?
|
|||
9
noxxx
24.01.13
✎
12:28
|
Вроде как метод из (7) помог решить проблему! Спасибо!
|
|||
10
ProgAL
24.01.13
✎
12:36
|
(9) Странно, что у меня и без
Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.Организации"); ЭлементБлокировки.УстановитьЗначение("Ссылка", Об.Ссылка); Блокировка.Заблокировать(); работало нормально и я мог из 2 сеанса открывать все постронние элементы справочника номенклатура. Возможно, это зависит от режима блокировки в корне конфигурации и в объекте (справочнике номенклатура.). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |