|   |   | 
| 
 | пессимистическая блокировка vs транзакционная | ☑ | ||
|---|---|---|---|---|
| 0
    
        OldCondom 31.03.23✎ 13:51 | 
        Открываю форму документа, по идее должна сработать пессимистическая. В тоже время в коде: ...ПолучитьОбъект().Записать() - и таки записывает. Нажимаю перечитать документ на форме и да, данные изменены. 
 Видимо я неправильно поинмаю объектные блокировки. В моем понимании этот объект должен был быть заблокирован для изменения и при методе записать() сработало бы исключение. | |||
| 1
    
        DimVad 31.03.23✎ 13:56 | 
        (0) А Вы начните что-нибудь менять в открытой форме...     | |||
| 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 | 
        ПолучитьОбъект().Записать() - и таки записывает . Вроде надо перед записать попробовать заблокировать().     | |||
| 6
    
        vicof 31.03.23✎ 14:04 | ||||
| 7
    
        OldCondom 31.03.23✎ 14:04 | 
        (5) так ведь Заблокировать() сработал при открытии формы другим сеансом. Далее другой сеанс делаеть программно Записать() и унего получается, вот для меня это загадка     | |||
| 8
    
        OldCondom 31.03.23✎ 14:09 | 
        (6) Ок, читаю: Пессимистическая блокировка объектов базы данных предназначена для того, чтобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.
 В основном механизм пессимистической блокировки используется системой 1С:Предприятие 8.1 для блокировки объектов, редактируемых в форме. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку. Я открыл форму документа, установилась пессимистическая блокировка. Далее программно перезаписываю этот документ и... ничего, никакой блокировки. | |||
| 9
    
        OldCondom 31.03.23✎ 14:11 | 
        Еще считать грубо говоря "пользовательским" вариантом? Так как транзакционной как-то все равно на объектную и они запишет новые состояние именно в таблицах, а не объекте?     | |||
| 10
    
        OldCondom 31.03.23✎ 14:11 | 
        Или*     | |||
| 11
    
        ИУБиПовиц 31.03.23✎ 14:12 | 
        (7) Перед записать другим сеансом надо заблокировать, если заблокируется - запись возможна, если нет - будет ошибка     | |||
| 12
    
        OldCondom 31.03.23✎ 14:14 | 
        (11) иными словами проверить объектную блокировку перед транзакционной? То есть транзакционна никак не смотрит на объектную?     | |||
| 13
    
        vicof 31.03.23✎ 14:16 | 
        (8) Форма у тебя открыта, когда ты под другим пользователем открываешь ту же форму и записываешь?     | |||
| 14
    
        OldCondom 31.03.23✎ 14:19 | 
        (13) под своим, тот же сеанс. Да, об этом думал, но: "тобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор"     | |||
| 15
    
        PuhUfa 31.03.23✎ 14:24 | 
        (8) ну написано же: "в тот момент, когда пользователь НАЧИНАЕТ модификацию объекта в форме". До этого момента вообще нет никакой блокировки.     | |||
| 16
    
        OldCondom 31.03.23✎ 14:33 | 
        (15) а что подразумевается под словом "Начинает"? Начинаем менять реквизит? Или начинает запись? Потому как во втором случае срабатвает транзакция и накладывается транзакционная блокировка на уровне СУБД, и нафига тогда нужна объектная?     | |||
| 17
    
        OldCondom 31.03.23✎ 14:38 | 
        Ок. Открываю форму одного документа в двух разных сеансах, тогда все ок и понятно. Второй сеанс не сможет что-то даже поменять в форме, выдаст предупреждение. А вот программно изменить - не вопрос, пожалуйста. 
 Итого, объектную можно охарактеризовать как работа в пользовательском варианте? | |||
| 18
    
        vicof 31.03.23✎ 14:44 | 
        Объектную можно наложить и программно.
 Только она накладывается не в момент записи, а когда ты напишешь объект.заблокировать() | |||
| 19
    
        vicof 31.03.23✎ 14:45 | 
        Только оно практически нигде не нужно     | |||
| 20
    
        OldCondom 31.03.23✎ 14:46 | 
        (18) а что именно она блокирует? Объект ведь, так? Тогда почему ПолучитьОБъект().Записать() - работает? Объект же заблокирован.     | |||
| 21
    
        OldCondom 31.03.23✎ 14:46 | 
        (19) в пользовательском варианте только, других вариантов я не вижу. Чтобы выскочило "Другой пользователь уже редактирует".     | |||
| 22
    
        Шурик71 31.03.23✎ 14:49 | 
        (20) Объект начнет быть заблокирован не при открытии - а когда ты изменишь какой-нибудь его реквизит (когда модифицированность = истина)     | |||
| 23
    
        OldCondom 31.03.23✎ 14:50 | 
        (22) пробовал. Меняю комментарий. Открываю второй сеанс, программно меняю комментарий и спокойно записывает.     | |||
| 24
    
        OldCondom 31.03.23✎ 14:51 | 
        если тоже самое сделать НЕ программно - да, ругается.     | |||
| 25
    
        ДНН 31.03.23✎ 14:51 | 
        (0) Пессимистическая блокировка защищает только от другой пессимистической блокировки. Про СУБД, транзакции и транзакционные блокировки она ничего не знает, поэтому и не может защитить от них.     | |||
| 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
    
        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.03.23✎ 15:14 | 
        (30) Во втором сеансе тоже нужно сделать Заблокировать     | |||
| 32
    
        ДНН 31.03.23✎ 15:15 | 
        И Заблокировать устарело. НА управляемых формах нужно использовать ЗаблокироватьДанныеДляРедактирования     | |||
| 33
    
        OldCondom 31.03.23✎ 15:18 | 
        (31) да кому нужно? Блокировка для того и блокирует, чтобы заблокировать. А не для того, чтобы по запросу выяснить, а не сказано ли, что она заблокирована? 
 (32) вот кстати в описании метода уже ясно и понятно написали: Заблокировать данные для редактирования в форме клиентского приложения. Все, в форме клиентского приложения. Пользовательский вариант работы. | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |