|
пессимистическая блокировка vs транзакционная | ☑ | ||
---|---|---|---|---|
0
OldCondom
31.03.23
✎
13:51
|
Открываю форму документа, по идее должна сработать пессимистическая. В тоже время в коде: ...ПолучитьОбъект().Записать() - и таки записывает. Нажимаю перечитать документ на форме и да, данные изменены.
Видимо я неправильно поинмаю объектные блокировки. В моем понимании этот объект должен был быть заблокирован для изменения и при методе записать() сработало бы исключение. |
1 25 |
||
1
DimVad
31.03.23
✎
13:56
|
(0) А Вы начните что-нибудь менять в открытой форме...
|
2 |
||
2
OldCondom
31.03.23
✎
13:59
|
(1) да это уже понятно, там оптимистическая сработает.
|
|||
3
OldCondom
31.03.23
✎
14:00
|
Таккк. Смотрю на ИТС: Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.
А как объект может быть изменен , если существует пессимистическая и никак другой сеанс по идее ничего не должен сделать? |
|||
4
OldCondom
31.03.23
✎
14:02
|
Я про это: Пессимистическая блокировка объектов базы данных предназначена для того, чтобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.
|
|||
5
ИУБиПовиц
31.03.23
✎
14:03
|
ПолучитьОбъект().Записать() - и таки записывает . Вроде надо перед записать попробовать заблокировать().
|
7 |
||
6
vicof
31.03.23
✎
14:04
|
8 |
|||
7
OldCondom
31.03.23
✎
14:04
|
(5) так ведь Заблокировать() сработал при открытии формы другим сеансом. Далее другой сеанс делаеть программно Записать() и унего получается, вот для меня это загадка
|
11 |
||
8
OldCondom
31.03.23
✎
14:09
|
(6) Ок, читаю: Пессимистическая блокировка объектов базы данных предназначена для того, чтобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.
В основном механизм пессимистической блокировки используется системой 1С:Предприятие 8.1 для блокировки объектов, редактируемых в форме. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку. Я открыл форму документа, установилась пессимистическая блокировка. Далее программно перезаписываю этот документ и... ничего, никакой блокировки. |
13 15 |
||
9
OldCondom
31.03.23
✎
14:11
|
Еще считать грубо говоря "пользовательским" вариантом? Так как транзакционной как-то все равно на объектную и они запишет новые состояние именно в таблицах, а не объекте?
|
|||
10
OldCondom
31.03.23
✎
14:11
|
Или*
|
|||
11
ИУБиПовиц
31.03.23
✎
14:12
|
(7) Перед записать другим сеансом надо заблокировать, если заблокируется - запись возможна, если нет - будет ошибка
|
12 |
||
12
OldCondom
31.03.23
✎
14:14
|
(11) иными словами проверить объектную блокировку перед транзакционной? То есть транзакционна никак не смотрит на объектную?
|
|||
13
vicof
31.03.23
✎
14:16
|
(8) Форма у тебя открыта, когда ты под другим пользователем открываешь ту же форму и записываешь?
|
14 |
||
14
OldCondom
31.03.23
✎
14:19
|
(13) под своим, тот же сеанс. Да, об этом думал, но: "тобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор"
|
|||
15
PuhUfa
31.03.23
✎
14:24
|
(8) ну написано же: "в тот момент, когда пользователь НАЧИНАЕТ модификацию объекта в форме". До этого момента вообще нет никакой блокировки.
|
16 |
||
16
OldCondom
31.03.23
✎
14:33
|
(15) а что подразумевается под словом "Начинает"? Начинаем менять реквизит? Или начинает запись? Потому как во втором случае срабатвает транзакция и накладывается транзакционная блокировка на уровне СУБД, и нафига тогда нужна объектная?
|
|||
17
OldCondom
31.03.23
✎
14:38
|
Ок. Открываю форму одного документа в двух разных сеансах, тогда все ок и понятно. Второй сеанс не сможет что-то даже поменять в форме, выдаст предупреждение. А вот программно изменить - не вопрос, пожалуйста.
Итого, объектную можно охарактеризовать как работа в пользовательском варианте? |
|||
18
vicof
31.03.23
✎
14:44
|
Объектную можно наложить и программно.
Только она накладывается не в момент записи, а когда ты напишешь объект.заблокировать() |
20 |
||
19
vicof
31.03.23
✎
14:45
|
Только оно практически нигде не нужно
|
21 |
||
20
OldCondom
31.03.23
✎
14:46
|
(18) а что именно она блокирует? Объект ведь, так? Тогда почему ПолучитьОБъект().Записать() - работает? Объект же заблокирован.
|
22 |
||
21
OldCondom
31.03.23
✎
14:46
|
(19) в пользовательском варианте только, других вариантов я не вижу. Чтобы выскочило "Другой пользователь уже редактирует".
|
|||
22
Шурик71
31.03.23
✎
14:49
|
(20) Объект начнет быть заблокирован не при открытии - а когда ты изменишь какой-нибудь его реквизит (когда модифицированность = истина)
|
23 |
||
23
OldCondom
31.03.23
✎
14:50
|
(22) пробовал. Меняю комментарий. Открываю второй сеанс, программно меняю комментарий и спокойно записывает.
|
27 |
||
24
OldCondom
31.03.23
✎
14:51
|
если тоже самое сделать НЕ программно - да, ругается.
|
|||
25
ДНН
31.03.23
✎
14:51
|
(0) Пессимистическая блокировка защищает только от другой пессимистической блокировки. Про СУБД, транзакции и транзакционные блокировки она ничего не знает, поэтому и не может защитить от них.
|
26 |
||
26
OldCondom
31.03.23
✎
14:55
|
(25) Вот, видимо это и надо держать в голове.
|
|||
27
vicof
31.03.23
✎
14:56
|
(23) ДокументОбъект.<Имя документа>.Заблокировать (DocumentObject.<Document name>.Lock)
ДокументОбъект.<Имя документа> (DocumentObject.<Document name>) Заблокировать (Lock) Доступен, начиная с версии 8.0. Синтаксис: Заблокировать() Описание: Выполняет блокировку объекта от изменения другими режимами или пользователями. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер. Пример: Попытка НовДокумент.Заблокировать(); Исключение Предупреждение(НСтр("ru = 'Невозможно заблокировать документ.';" + " en = 'Can't lock the document.'")); КонецПопытки; |
28 |
||
28
OldCondom
31.03.23
✎
15:02
|
(27) и?
Ну ок, не поленился) об = объект.Реквизит1.ПолучитьОбъект(); об.Заблокировать(); ДатаВыхода = ТекущаяДата() + 15; Пока ТекущаяДата() < ДатаВыхода Цикл а = 1; КонецЦикла; Во втором сеансе программно меняю, все меняется в эти 15 сек. |
|||
29
vicof
31.03.23
✎
15:11
|
И ты реквизит1 меняешь во втором сеансе?
|
|||
30
OldCondom
31.03.23
✎
15:13
|
нет, реквизит1 - это на форме, там документ. Запускаю этот код, ставлю этому документу пессимистическую блокировку, во втором сеансе этому же документ спокойно меняю комментарий и записываю
|
31 |
||
31
ДНН
31.03.23
✎
15:14
|
(30) Во втором сеансе тоже нужно сделать Заблокировать
|
33 |
||
32
ДНН
31.03.23
✎
15:15
|
И Заблокировать устарело. НА управляемых формах нужно использовать ЗаблокироватьДанныеДляРедактирования
|
33 |
||
33
OldCondom
31.03.23
✎
15:18
|
(31) да кому нужно? Блокировка для того и блокирует, чтобы заблокировать. А не для того, чтобы по запросу выяснить, а не сказано ли, что она заблокирована?
(32) вот кстати в описании метода уже ясно и понятно написали: Заблокировать данные для редактирования в форме клиентского приложения. Все, в форме клиентского приложения. Пользовательский вариант работы. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |