|
Блокирование регистра расчета на чтение | ☑ | ||
---|---|---|---|---|
0
rfox
29.09.14
✎
23:44
|
Добрый день!
Возник следующий вопрос: есть ли возможность в 8.2 полной блокировки таблицы на чтение? Делаю следующим образом: в транзакции выставляю исключительную блокировку на весь регистр в целом (также пробовал заблокировать данные путем выполнения запроса с галочкой "для изменения"). В этот момент в другом сеансе данные из регистра не могут быть прочитаны ни через набор записей, ни запросом в транзакции. При этом запросом вне транзакции данные собираются. Необходимо заблокировать такое чтение (в идеале блокировка д.б. не на весь регистр, а на часть записей по параметрам, например по измерению) НачатьТранзакцию(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(); ЭлементБлокировки.Область = "РегистрРасчета.РегистрРасчета1"; ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); //В этот момент пытаюсь в параллельном сеансе читать данные из регистра расчета, необходимо чтобы они не были доступны ОтменитьТранзакцию(); Клиент-серверный вариант. Уровни блокировки пробовал выставлять и в автомат и управляемый. |
|||
1
Reaper_1c
30.09.14
✎
00:17
|
99% задач, для решения которых предназначен регистр расчета не требуют описания блокировок в коде. Приведи задачу полностью.
|
|||
2
rfox
30.09.14
✎
00:31
|
Во время расчета в регистр постепенно записываются данные, которые могут стать источником для заполнения других документов. Также эти данные могут быть и удалены в процессе расчета.
Необходимо заблокировать в процессе выполнения расчета заполнение документов на основе данных по рассчитываемому регистратору (т.е. чтобы какие-либо промежуточные данные расчетов не могли быть никем считаны). При записи или проведении сработает транзакция, возникнет блокировка и все будет в порядке, но конфа сильно не типовая и есть большое количество документов и заполнялок в них, в которых чтение будет вне транзакций и данные будут считаны, а на их основе что-нибудь расчитано. |
|||
3
cons74
30.09.14
✎
08:07
|
А что мешает формировать записи при расчете, но не записывать их в бд? Т.е. Движения.записывать = ложь?
|
|||
4
Reaper_1c
30.09.14
✎
08:44
|
(2) http://its.1c.ru/db/v83doc#bookmark:dev:TI000000531
(3) А ты сформируй фактический период действия без записи данных в базу. |
|||
5
rfox
30.09.14
✎
09:53
|
(4) в материалах прочитал следующее:
"Режим работы с данными вне транзакции допускает только операции чтения данных. Этот режим введен для того, чтобы обеспечить максимальную скорость и параллельность чтения данных. Поэтому любая операция чтения данных, выполняемая вне транзакции, считается безответственной. Это означает, что такая операция чтения может вернуть устаревшие данные или даже незафиксированные изменения, произведенные другой транзакцией, т. е. чтение выполняется «не глядя» на блокировки данных, расставленные другими транзакциями." Это означает что заблокировать таблицу для внетранзакционного чтения нет возможности. Я все так понял? |
|||
6
Reaper_1c
30.09.14
✎
10:58
|
(5) До конца дочитай. 8.3 в связке с различными субд по разному реализует безответственное чтение. Предыдущие версии использовали "грязное" чтение, 8.3 стремится использовать согласованное, если субд позволяет.
|
|||
7
rfox
30.09.14
✎
11:30
|
(6) Спасибо, если будет время, посмотрю как отработает на 8.3, в 8.2 буду искать другие пути решения.
|
|||
8
Зеленый пень
30.09.14
✎
11:38
|
У нас похожая беда была с документами, создающимися в транзакции - юзеры успевали до окончания транзакции документы открыть и распечатать. И если транзакция отменялась, на руках оказывался несуществующий документ.
Можно писать в реквизит регистра признак "ВРЕМЕННЫЙ", и снимать его после транзакции (или в самом конце транзакции, когда есть уверенность, что транзакция будет завершена) - но его надо анализировать в критичных к грязному чтению местах. |
|||
9
DmitrO
30.09.14
✎
11:45
|
"При этом запросом вне транзакции данные собираются. Необходимо заблокировать такое чтение (в идеале блокировка д.б. не на весь регистр, а на часть записей по параметрам, например по измерению)"
Для решения задачи необходимо начать транзакцию, установить блокировку на чтение, а потом уже собирать данные запросом, после этого торжественно зафиксировать или отменить транзакцию (отменять можно если ничего не писалось естественно). |
|||
10
rfox
30.09.14
✎
11:58
|
(8) (9), но в любом случае это надо делать во всех местах, где эти данные читаются.
В итоге, пойду по пути (9). Просто хотелось знать, возможно ли установить такую блокировку для чтения, которое будет вне транзакций. Всем спасибо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |