|
Блокировки, параллельная работа с дакументами | ☑ | ||
---|---|---|---|---|
0
roman2
18.01.13
✎
15:08
|
Уважаемы знатоки, внимание вопрос).
В цикле запускается пакетная обработка документов. Изменяется реквизит и записывается (проводится). Одновременно с этим работает обмен, которые обрабатывает те же документы . Как грамотно сделать, чтобы все документы обработались? Я решал эту проблему криво. В цикле делал попытку до тех пор, пока документ наконец не запишется без ошибки. Кто что предложит? |
|||
1
Bober
18.01.13
✎
15:10
|
либо в попытке до упора, либо переписывать выгрузку данных
|
|||
2
roman2
18.01.13
✎
15:15
|
(1) А переписывать то куда копать? Я как раз про это, как это решается по методике 1С?
|
|||
3
ОчкарикСлава
18.01.13
✎
15:15
|
пауза поставь в обработках..
|
|||
4
Нуф-Нуф
18.01.13
✎
15:16
|
остановить обмен
|
|||
5
Maxus43
18.01.13
✎
15:17
|
заблокируй документы (например запрос с ДЛЯ ИЗМЕНЕНИЯ в транзакции). в это время обмен будет стоять
|
|||
6
roman2
18.01.13
✎
15:20
|
(5) Это особенность платформы? У нас обмен самописный.
|
|||
7
pavig
18.01.13
✎
15:20
|
(0) организуй работу так, чтобы сначала был обмен, потом пакетная обработка, или наборот.
если и то и другое запускается по расписанию, то, например, организуй что-то типа очередей: например, свой РС, в который записывай очередность доступа: сначала обработка, потом обмен (или наоборот), в зависимоти от очередности пусть либо обработка ждем завершения обмена, либо наоборот может не очень конечно вариант, но первое что пригло в голову... (5) а обмен в этом случае не вылетит с исключениями? если нет то попробуй и так.... только если режим блокировок = Управляемый, блокировку надо будет установить по-другому, не через запрос, да и ДЛЯ ИЗМЕНЕНИЯ сработает только внутри транзакции записи.... |
|||
8
Maxus43
18.01.13
✎
15:21
|
(7) обмен вылетит, дак в след раз пошлёт. а долбить запись дока попыткой об блокировки обмена - вобще криво...
|
|||
9
roman2
18.01.13
✎
15:22
|
Еще вопрос. А нельзя ли как-то узнать, что объект заблокирован, до того как я буду его перезаписывать?
|
|||
10
Maxus43
18.01.13
✎
15:22
|
(9) нет
|
|||
11
pumbaEO
18.01.13
✎
15:25
|
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
Заблокировать (Lock) Синтаксис: Заблокировать() Описание: Выполняет блокировку объекта от изменения другими режимами или пользователями. Доступность: Сервер, толстый клиент, внешнее соединение. Пример: Попытка НовДокумент.Заблокировать(); Исключение Текст = "ru = ""Невозможно заблокировать документ."";" + " en = ""Can't lock the document."""; Предупреждение(НСтр(Текст)); КонецПопытки; |
|||
12
roman2
18.01.13
✎
15:27
|
Я придумал решение.
Делаю регистр сведений "ЗаблокированныеДокументы". Обмен его заполняет своими доками. Как все сделает, очищает. Пакетная обработка проверяет, если документ есть в регистре, работает со следующим доком. А текущий заносит в очередь. В конце очередь рекурсивно пытается рассосаться. Как-то так..)) |
|||
13
Maxus43
18.01.13
✎
15:27
|
(11) смысла нет, при обмене не сможет заблокировать
|
|||
14
Maxus43
18.01.13
✎
15:28
|
(12) обмен часто?
|
|||
15
Maxus43
18.01.13
✎
15:29
|
если там всё самописно так - сделай все свои операции До или После обмена, используя тоже фоновое задание. Короче пусть последовательно всё делает
|
|||
16
roman2
18.01.13
✎
15:35
|
Всем спасибо! Особые благодарности Maxus43 - респект!
|
|||
17
Maxus43
18.01.13
✎
15:40
|
(16) чо сделал то?
|
|||
18
Maxus43
18.01.13
✎
15:42
|
(7) Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных.
Считанные данные становятся недоступными для чтения в других сессиях. Для файлового варианта блокируются указанные таблицы, а для клиент-серверного варианта — только выбранные записи. Блокировка снимается после завершения транзакции. (с) т.е. не в транзакции записи, а в транзакции вобще |
|||
19
pumbaEO
18.01.13
✎
15:43
|
(13) (11) ->(9)
|
|||
20
Maxus43
18.01.13
✎
15:45
|
(19) в попытке опять же? иначе вылетит
|
|||
21
pavig
18.01.13
✎
15:45
|
(18) ну или явно указывать транзакцию, не суть
суть - что в транзакции, а не просто так как могло показаться ТСу прочитай он твоё сообщение |
|||
22
Maxus43
18.01.13
✎
15:46
|
(21) > (5) "ДЛЯ ИЗМЕНЕНИЯ в транзакции" - я не забыл указать)
|
|||
23
ssh2012
18.01.13
✎
15:50
|
ДЛЯ ИЗМЕНЕНИЯ заблокирует от чтения только запросами с такой же конструкцией
|
|||
24
Maxus43
18.01.13
✎
15:51
|
(23) с чего вдруг? выбранные запросом данные становятся недоступны в других сессиях
|
|||
25
Bober
18.01.13
✎
15:51
|
(2) вся проблема в методах обмена выбрать изменения и прочитать изменения
первый блокирует объект при вызове Следующий() второй блокирует при записи через параметр количество элементов в транзакции. |
|||
26
Bober
18.01.13
✎
15:53
|
(25) Первый лечится свой выборкой и сериализацией (ЗаписатьXML), второй своим чтением xml (ПрочитатьXML).
|
|||
27
ssh2012
18.01.13
✎
15:56
|
(24) другой запрос в параллельной в транзакции с ДЛЯ ИЗМЕНЕНИЯ не выполнится, без ДЛЯ ИЗМЕНЕНИЯ выполнится. Изменить данные до конца первой транзакции нельзя будет независимо от наличия ДЛЯ ИЗМЕНЕНИЯ. Вроде так.
|
|||
28
pavig
18.01.13
✎
15:57
|
(22) сорри, я был невнимателен
|
|||
29
ssh2012
18.01.13
✎
16:24
|
(25) если ВыбратьИзменения выполнен в транзакции, то сразу после выполнения метода заблокировано все попавшее в выборку
|
|||
30
Maxus43
18.01.13
✎
16:32
|
ибо блокируются таблицы Изменений обхектов
|
|||
31
Bober
18.01.13
✎
16:35
|
(30) поэтому типовой обмен РИб такой проблемный.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |