Имя: Пароль:
1C
1С v8
Транзакции и Для изменения
0 wladimir90
 
04.10.12
09:35
Добрый день.
Есть некий независимый регистр сведений в который записывают данные ряд документов. Раз в минуту данные регистра считываются и модифицируются во время обмена данными.
Однажды во время исполнения запроса на считывание данных (во время Выполнить()) вышла ошибка "Конфликт блокировок при выполнении транзакции... Не удалось продолжить просмотр с NOLOCK вследствие перемещения данных.".
Как я понимаю ошибка возникла из за того что считывания данных из регистра пошло в тот самый момент когда некий документ производил в него запись.
Если я в текст запроса обмена вставлю Для изменения - решит ли это проблему? Или если я включу транзакцию на время выполнения обмена?
1 МихаилМ
 
04.10.12
09:46
2 wladimir90
 
04.10.12
09:51
(1) Будет ли выходом применить такую конструкцию прямо перед выполнением запроса?:

Пока ТранзакцияАктивна() Цикл

КонецЦикла;
3 МихаилМ
 
04.10.12
09:58
(2)
не знаю. я бы сначала воспользовался советом в (1)
4 pavig
 
04.10.12
10:03
(0) Для Изменения не решит проблему, так как Для Изменения срабатывает только если запрос выполняется во время транзакции записи
5 1Страх
 
04.10.12
10:04
(4) просто транзакции, разве нет?
6 wladimir90
 
04.10.12
10:05
(3) Там сказано "отправьте запрос повторно" - то что я написал в (2) делает нечто подобное. Не отправляет заново, но ждет завершения всех транзакций на сервере. С другой стороны можно в цикл "пока" с обработкой исключения включить выполнить().
Фраза "удалите подсказку блокировки NOLOCK" непонятна вообще.
7 pavig
 
04.10.12
10:10
(6) а вот это может и прокатить
8 pavig
 
04.10.12
10:11
(7) хотя.... транзакции могут происходиьт постоянно, необходимо чтобы они становились в очередь если я правильно понимаю....
9 pavig
 
04.10.12
10:16
(5) если не в транзакции записи, то заблокируется исключительно на время выполнения запроса; если в транзакции записи, то на все время выполнения транзакции...

(0) выход - перевод на упр блокировки плана обмена, выполнение записи в этот регистр порциями по немногу записей чтобы ожидание транзакцией чтения транзакции записи не превышало допустимый временной интервал
10 wladimir90
 
04.10.12
10:23
(8) Тоже об этом подумал - если организация разрастется до нормального количества пользователей, то 1с из транзакций будет выходить в лучшем случае только во время обеда.
(9) Т.е. включить код обмена в транзакцию с управляемым режимом блокировок?
11 pavig
 
04.10.12
10:30
(10) для начала все же попробуй разбить записываемые наборы на пачки по нескольку записей (несколько сот, несколько тысяч - я не могу кнкретно подсказать по скольку разбивать, надо анализировать опытным путем), потом - в упр режим блокировок (это гораздо более трудоемко чем первая часть, потому что просто НачатьТранзакцию(УпрРежим) не прокатит, выдаст ошибку: надо будет переводить регистр, а вместе с регистром - документы, которые делают записи в этот регистр, а еще перед этим изменить свойство конфы в Автом и Упр Режим, кроме этого, скорее всего, придется перевести план обмена (если используете его) в упр режим, а если переводим план обмена, то и все участвующие в нем объекты тоже должны быть в упр режиме. чтобы весь обмен заработал в упр режиме - и все это ради одного регистра...)