|
Как заблокировать регистр накопления при записи набора? | ☑ | ||
---|---|---|---|---|
0
Gorr
03.07.14
✎
14:32
|
Здравствуйте!
В моей обработке выполняется запись довольно большого набора записей в транзакции. Как правильно заблокировать регистр от чтения другими сеансами на время выполнения записи? Пробовал так: Блокировки = Новый БлокировкаДанных; ЭлементБлокировки = Блокировки.Добавить("РегистрНакопления."+ВыбРегистр); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(); Попытка Блокировки.Заблокировать(); Исключение Предупреждение("Не удалось заблокировать регистр!"); возврат; КонецПопытки; Ставил бряк в отладчике после вызова Заблокировать(), запускал дополнительный сеанс из него консолью запросов без труда прочитал записи блокируемого регистра. Как заблокировать регистр чтобы у других сеансов вообще доступа не было? |
|||
1
Fragster
гуру
03.07.14
✎
14:35
|
а режим блокировки у базы какой?
|
|||
2
Fragster
гуру
03.07.14
✎
14:35
|
и у самого регистра и у транзакции стартованной
|
|||
3
Spieluhr
03.07.14
✎
14:44
|
(0) все правильно, только вне транзакции (консолью запросов) читать всегда можно
|
|||
4
Gorr
03.07.14
✎
14:48
|
(1) у конфигурации режим автоматический
|
|||
5
Fragster
гуру
03.07.14
✎
15:02
|
(4) Выбрать * из Регистр ДЛЯ ИЗМЕНЕНИЯ
|
|||
6
Жан Пердежон
03.07.14
✎
15:03
|
(0) от зряного чтения - НИКАК
|
|||
7
floody
03.07.14
✎
15:06
|
(6) от грязного чтения как раз и спасает режим блокировки "исключительный"
|
|||
8
Maxus43
03.07.14
✎
15:13
|
(7)>(4)
Ну раз автоматический, то о каких Новый БлокировкаДанных; мы вообще говорим |
|||
9
Maxus43
03.07.14
✎
15:14
|
тут надо (5), причем в транзакции явной или неявной
|
|||
10
Жан Пердежон
03.07.14
✎
15:17
|
(7) "исключительный" не дает ставить на ресурс другие блокировки, но никто не мешает читать вообще без установки блокировок, так что (5) не поможет ни разу
|
|||
11
Maxus43
03.07.14
✎
15:19
|
а, я чот топик то не прочитал, от чтения надо заблокировать...
|
|||
12
Gorr
03.07.14
✎
15:25
|
остается только УстановитьМонопольныйРежим(Истина);
|
|||
13
Fragster
гуру
03.07.14
✎
15:26
|
(12) а чем мешает чтение? ну почитают... документы-то все равно не смогут делать...
|
|||
14
Gorr
03.07.14
✎
16:10
|
(13) существует вероятность получения неверных данных и запись на основании этих неверных данных уже в другие регистры. почему не смогут?
|
|||
15
Spieluhr
03.07.14
✎
16:17
|
(4) Если у вас автоматический режим блокировок в конфигурации, то пытаться наложить управляемую смысла нет, этот код игнорируется. в последних версиях платформы сделали на этот случай ругалку, т.к. люди путаются
(14) в транзакции нужно получать данные, если на их основе принимаются решения |
|||
16
Gorr
03.07.14
✎
16:39
|
(15) таким образом, работу типовых документов моя обработка не заденет?
|
|||
17
Gorr
03.07.14
✎
16:41
|
поскольку запись обработкой выполняется в транзакции и анализ остатков документами неявно тоже выполняется в транзакции.
|
|||
18
Fragster
гуру
03.07.14
✎
16:41
|
(16) если сделаешь (5) - типовые документы не смогут проводиться, пока твоя обработка работает
|
|||
19
Gorr
03.07.14
✎
16:47
|
(18) мне не понятно мне что предлагается в (5)?
//1. Подготовка набора к записи. НачатьТранзакцию(); Запрос.Выполнить(); //2. ЗаписьНабора Набор.Записать(); ЗафиксироватьТранзакцию(); Это предлагается в (5)? |
|||
20
Gorr
03.07.14
✎
16:49
|
(15) а вы что думаете относительно (18)?
|
|||
21
Spieluhr
03.07.14
✎
16:49
|
(19) да, это
|
|||
22
Fragster
гуру
03.07.14
✎
16:49
|
(19) типа того. но как только конфа станет управляемой - код превратится в тыкву
|
|||
23
Spieluhr
03.07.14
✎
16:51
|
(20) Fragster в (5) и в (18) прав. Но это справедливо, пока конфа в автоматическом режиме блокировок работает
|
|||
24
Fragster
гуру
03.07.14
✎
16:52
|
(23) т.е. я прав еще и в (22)
|
|||
25
Spieluhr
03.07.14
✎
16:53
|
(24) конечно
|
|||
26
Gorr
03.07.14
✎
17:06
|
(22) пожалуйста без эмоций.
Довайте подведем итог. Конструкция "Для изменения" запроса внутри транзакции блокирует всю таблицу не только для записи, но и для чтения другими сессиями при использовании автоматического режима блокировки. |
|||
27
Fragster
гуру
03.07.14
✎
17:09
|
вот что пишет справка:
Конфигуратор 1С:Предприятие 8 Предложение ДЛЯ ИЗМЕНЕНИЯ Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных. Считанные данные становятся недоступными для чтения в других сессиях. Для файлового варианта блокируются указанные таблицы, а для клиент-серверного варианта — только выбранные записи. Блокировка снимается после завершения транзакции. |
|||
28
Gorr
03.07.14
✎
17:16
|
думаю, если бы в справке додумались написать "ДЛЯ ЧТЕНИЯ" вопросов было бы куда меньше
|
|||
29
Gorr
03.07.14
✎
17:23
|
в итоге исправил код на
НачатьТранзакцию(); Запрос = Новый Запрос ("выбрать * из ""РегистрНакопления."+Выбрегистр+" для изменения"); Попытка Запрос.Выполнить(); Исключение Предупреждение("Не удалось заблокировать регистр!"); возврат; КонецПопытки; |
|||
30
Жан Пердежон
03.07.14
✎
17:26
|
(26) не совсем, прочитать не блокирую данные все равно можно
|
|||
31
Spieluhr
03.07.14
✎
17:39
|
(29) в итоге я так и не понял зачем вам блокировать на чтение весь регистр? Вне транзакции , т.е. из консоли запросов или в любом отчете данные будут прочитаны независимо от установленных блокировок, а параллельные транзакции и так не смогут прочитать те данные, которые вы измените в своей (ваш набор записей).
на выходе получите избыточную блокировку и никакой пользы. |
|||
32
Gorr
03.07.14
✎
17:52
|
(31) вот я же вас спрашивал в (16) и (17) постах, но вы промолчали. вот я и подумал что все же нужно блокировать принудительно
|
|||
33
Spieluhr
03.07.14
✎
17:57
|
(32) ответьте все же на вопрос: зачем вам блокировать на чтение весь регистр?
|
|||
34
Gorr
03.07.14
✎
17:59
|
(33) давно уже ответил см (14)
|
|||
35
Gorr
03.07.14
✎
18:01
|
еще непонятно как проверить режим блокировки конфигурации:
если Метаданные.РежимУправленияБлокировкойДанных = РежимУправленияБлокировкойДанныхПоУмолчанию.автоматический выдает ошибку переменная РежимУправленияБлокировкойДанныхПоУмолчанию не определена |
|||
36
Fragster
гуру
03.07.14
✎
20:53
|
(35) смотри в СП вмнимательнее
|
|||
37
Gorr
03.07.14
✎
21:48
|
ОбъектМетаданныхКонфигурация.РежимУправленияБлокировкойДанных (ConfigurationMetadataObject.DataLockControlMode)
ОбъектМетаданныхКонфигурация (ConfigurationMetadataObject) РежимУправленияБлокировкойДанных (DataLockControlMode) Использование: Только чтение. Описание: Тип: РежимУправленияБлокировкойДанныхПоУмолчанию. Содержит варианты режимов управления блокировкой данных, устанавливаемых по умолчанию. Доступность: Сервер, толстый клиент, внешнее соединение. |
|||
38
Gorr
03.07.14
✎
21:49
|
я так понимаю РежимУправленияБлокировкойДанныхПоУмолчанию должно быть системное перечисление?
|
|||
39
Gorr
03.07.14
✎
21:53
|
(36) не вижу нифига
|
|||
40
Gorr
04.07.14
✎
09:24
|
UP!
|
|||
41
Spieluhr
04.07.14
✎
10:12
|
||||
42
Gorr
04.07.14
✎
10:54
|
(41) некрасиво.
На случай если кто еще сталкнется с необходимостью проверки объектов метаданных на перечислимое свойство, доступ этим "перечислимым" перечислениям можно получить через "Метаданные.СвойстваОбъектов.ПеоечислимоеСвойство.ЗначениеСвойства" |
|||
43
Fragster
гуру
04.07.14
✎
11:58
|
ПеречислимыеСвойстваОбъектовМетаданных (MetadataObjectEnumeratedProperties)
Свойства: .... РежимУправленияБлокировкойДанныхПоУмолчанию (DefaultDataLockControlMode) ..... Описание: Предоставляет доступ к системным перечислениям, выступающим в качестве значений свойств объектов метаданных. Состав и описание системных перечислений объектов метаданных описан в разделе "Системные перечисления свойств объектов метаданных". Доступность: Сервер, толстый клиент, внешнее соединение. См. также: ОбъектМетаданныхКонфигурация, свойство СвойстваОбъектов |
|||
44
Fragster
гуру
04.07.14
✎
11:58
|
в общем метаданные.свойстваобъектов.РежимУправленияБлокировкойДанныхПоУмолчанию.Управляемый
|
|||
45
Fragster
гуру
04.07.14
✎
11:59
|
а вообще - просто код од другого режима блокировки будет проигнорирован будет
|
|||
46
Gorr
04.07.14
✎
12:01
|
(45) я сделал так, что в одном случае осуществляется выборка, в другом используется объект блокировка. таким образом получилось универсально.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |