Имя: Пароль:
1C
1С v8
Объектная оптимистическая блокировка
0 laby1
 
10.06.19
09:16
Добрый день, а может утро, коллеги по цеху.

Подскажите пожалуйста, как устанавливается оптимистическая блокировка?

Везде пишут, что пессимистическая блокировка устанавливается методом объекта .Заблокировать() или методом глобального контекста ЗаблокироватьДанныеДляРедактирования.
А про оптимистическую блокировку пишут, что если запись была изменена, то при сохранении объекта будет ошибка.
Но как устанавливается оптимистическая блокировка, какой код, почему-то не пишут.
1 Spieluhr
 
10.06.19
09:22
Системный реквизит ВерсияДанных. При каждой записи он изменяется, если у формы одна версия данных, а в базе уже другая, то перед записью будет вызвано исключение "Данные были изменены или удалены другим пользователем". Управлять такой блокировкой средствами встроенного языка нельзя
2 fisher
 
10.06.19
09:23
> Но как устанавливается оптимистическая блокировка, какой код, почему-то не пишут.
А она всегда работает и так.
3 lucbak
 
10.06.19
09:23
Жди 8.3.15 (можно скачать ознакомительную версию) - там это есть.
Или попробуй это http://catalog.mista.ru/public/1043344/
4 fisher
 
10.06.19
09:25
(2) + "оптимистическая блокировка гарантирует, что пользователь изменяет актуальные данные объекта, которые хранятся в информационной базе, а не какой-то их предыдущий вариант"
5 laby1
 
10.06.19
09:34
(4) Это то понятно
(2) А о том, что это и так работает, нигде не написано
6 Cyberhawk
 
10.06.19
09:35
(5) Так никто твои фантазии (что она где-то как-то или когда-то "устанавливается") развенчивать не обязан
7 laby1
 
10.06.19
09:35
(3) Да это всё понятно. Вопрос в том, что везде написано, что для пессимистической блокировки надо в коде вызвать метод "Заблокировать", а для оптимистической ничего не написано.
8 Cyberhawk
 
10.06.19
09:37
+(6) Ты сам себе что-то там придумал и теперь ищешь этому подтверждение
9 laby1
 
10.06.19
09:37
(6) Здрасте, написано - блокировка! Оптимистическая. Если блокировка, значит она должна устанавливаться. А если она не устанавливается, то какая она к лопухам блокировка. Это просто при записи проверка версии.
10 laby1
 
10.06.19
09:38
(8) Всё должно быть чётко. Заблокировать() - пессимистическая блокировка. А как для оптимистической - непонятно...
11 laby1
 
10.06.19
09:39
Хочу понять, как установить на объект оптимистическую блокировку.
12 Cyberhawk
 
10.06.19
09:41
(9) "Если блокировка, значит она должна устанавливаться" // Как видишь, твой вывод не соответствует действительности.
"если она не устанавливается, то какая она к лопухам блокировка" // Это уже к ребяткам из 1С вопрос. Ты еще про свойство "БлокироватьДляИзменения" спросил бы, бгг.
13 laby1
 
10.06.19
09:41
В какой момент устанавливается эта блокировка? Или просто при редактировании меняется номер версии? Тогда где блокировка?
14 Cyberhawk
 
10.06.19
09:43
"Тогда где блокировка?" // В отлупе-сообщении пользователю. Ему не дают записать, "блокируют" это действие.
15 laby1
 
10.06.19
09:45
(14) Так хотя бы написали где-то, что по-умолчанию изменение версии объекта - это является оптимистической блокировкой этого объекта.
16 Cyberhawk
 
10.06.19
09:47
(15) Это ложь, зачем ее кому-то где-то писать?
17 laby1
 
10.06.19
09:47
(16) А что же тогда правда?
18 laby1
 
10.06.19
09:49
(16) оптимистической блокировки не бывает?
19 Cyberhawk
 
10.06.19
09:50
(17) Ты пытаешься распространить свойство "длящаяся во времени" других блокировок (блокировка - значит, она имеет начало и конец) на оптимистичную блокировку - в этом твоя ошибка
20 mistеr
 
10.06.19
10:03
(13) Оптимистическая блокировка выполняется в момент записи изменений в базу. Если платформа обнаруживает (с помощью номера версии), что данные были изменены другим сеансом, то запись текущих изменений блокируется. Это и есть оптимистическая блокировка. Она не устанавливается явно.
21 mistеr
 
10.06.19
10:04
В СУБД есть множество блокировок, которые не устанавливаются явно. Тем не менее они работают и называются блокировками.
22 laby1
 
10.06.19
10:09
(20) То есть в момент записи, без каких-либо дополнительных операторов, устанавливается блокировка. Это оптимистическая блокировка. И она смотрит, если нет других оптимистических блокировок, то записывает объект в БД.
23 laby1
 
10.06.19
10:20
(22) Нет, она смотрит, не прошла ли запись другой оптимистической блокировкой
24 laby1
 
10.06.19
10:21
А если объект заблокирован пессимистической блокировкой. То запишется ли этот же объект оптимистической?
25 laby1
 
10.06.19
10:23
(24) По идее да. Запишется. Но при записи пессимистически заблокированного объекта, всё равно будет сработана защита блокировки оптимистической. То есть даже если мы пользуемся пессимистической блокировкой, оптимистическая также будет в момент записи.
26 laby1
 
10.06.19
10:29
В общем, тайна оптимистической блокировки не раскрыта, будем программить по наитию.
27 mistеr
 
10.06.19
10:57
(22) (23) Не выдумывай отсебятину. Смотрит только, что данные были изменены другим сеансом. Неважно каким способом.

(24) Запишется. А тот сеанс, гда была пессимистическая, при записи получит ошибку.
28 mistеr
 
10.06.19
11:04
(26) Вообще говоря, термин "оптимистическая блокировка" не совсем корректный. В английском нет термина "optimistic lock", а есть только "optimistic locking". Что точнее перевести, как "оптимистическое блокирование [данных]".

При пессимистическом блокировании же, существует блокировка (lock) как объект где-то в памяти сервера, который явно создается и уничтожается.

Таким образом, оптимистическое блокирование — это такая хитрая техника контроля целостности данных без явных блокировок.
29 Йохохо
 
10.06.19
11:07
(28) хитрая техника на нехитром поле версия
30 fisher
 
10.06.19
11:16
(26) Что неясно-то? При изменении версии объекта его запись БЛОКИРУЕТСЯ системой. Всегда. Надеюсь, понятно зачем?
Почему оптимистическая? Потому что проверка производится при записи - т.е. в самый последний момент. В оптимистическом предположении, что версия изменена не будет.
Если у вас когнитивный диссонанс с понятием "блокировка" как с действием и как с отдельной сущностью - ну, раскройте мозг, осознайте многообразие языка и смиритесь с этим.
31 olegves
 
10.06.19
11:19
блокировка наступает, даже когда обэтом программист и не позаботится для сохранения целостности данных. Например, ты записал набор регистра накопления. В этот момент система создает блокировку до момента обеления записанных данных, т.е. до момента окончания транзакции (или транзакций), в которой происходит эта запись. А если ты после записи регистра накопления проверил остатки, и они тут стали  отрицательными, то установив Отказ=Истина в модуле проведения ты откатываешь уже сделанную запись регистра накопления,и если никто не читает (нет прав) грязные данные в базе, то твоей записи набора данных для других сеансов как-бы не происходит, хотя физически данные записываются и затем удаляются внутри транзакции. А если кто-то из другого сеанса пытается изменить тот же набор данных, пока еще действует твоя транзакция, то он будет послан блокировкой ожидать окончания транзакции.
32 laby1
 
10.06.19
13:07
(30) Блокируется только для тех, кто начал уже изменение.
33 laby1
 
10.06.19
13:09
(32) Хотя на самом деле ничего не блокируется, только изменяется версия.
34 fisher
 
10.06.19
15:15
(33) Блокируется выполнение записи объекта. Не "накладывается блокировка" на запись. А просто блокируется выполнение записи. Да, это просто банальная проверка на версию. Да, это проверка безусловная.
Вот тебе РТФМ:
"Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса. Фактически, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Эта проверка построена на анализе номера версии объекта, хранящейся в базе данных и номера версии, помещенной в память компьютера в момент считывания данных из информационной базы. Если при записи объекта номера его версий отличаются, то будет выдано предупреждение о том, что версия объекта изменилась или он был удален, то есть сработает оптимистическая блокировка"
35 Сияющий в темноте
 
11.06.19
08:18
Еще бы при записи без изменений научиться не менять номер версии.
36 fisher
 
11.06.19
08:50
(35) Легко. Всего-то при записи без изменений не делать запись.
37 mistеr
 
11.06.19
09:03
(36) Ага, особенно с кучей полей типа ХЗ.

Лучше научиться не использовать служебное поле номер версии не по назначению.
38 Cyberhawk
 
11.06.19
09:06
Лучше бы в номер версии добавили сахара, чтоб ее можно было по хронологии упорядочивать. Эдакое поле timestamp.
39 Василий Алибабаевич
 
11.06.19
09:08
(25) Во бред. Неужели до вас никто никогда не доносил смысл понятий оптимистической и пессимистической блокировки?
40 mistеr
 
11.06.19
09:10
(38) Не выйдет.
41 Василий Алибабаевич
 
11.06.19
09:13
(38) Кого упорядочивать? В конкретной записи существует единственное значение номер версии. Упорядочивать некого. Если конечно при каждой записи не копировать предыдущее состояние в отдельное хранилище (например РС "версии объектов"). Вот там (в отдельном хранилище) можно и поупорядочивать. В исходной таблице должна существовать единственная запись с единственным значением "версия". Пусть даже и таймштамп. Просто для того, чтоб система могла определить изменились ли данные с момента последнего чтения. Все. Больше ни для чего.
42 Cyberhawk
 
11.06.19
09:16
(41) Упорядочивать два номера версии: тот который у меня на руках от предыдущего считывания состояния объекта из БД и тот, который при текущем считывании. Скользящую загрузку данных из внешних источников ни разу не делал что ли? Когда нужно засасывать только измененные объекты - вот там поле timestamp и пригождается, хранящее дату последнего изменения объекта (записи таблицы). В 1С такое на планах обмена конечно же можно реализовывать, но это дополнительно надо соломку стелить, а так было бы из коробки поле timestamp.
43 mistеr
 
11.06.19
09:19
(42) Гарантировать упорядоченность этого timestamp по времени будет очень сложно (несколько серверов в кластере и т.п.). А без гарантий он не нужен.
44 Cyberhawk
 
11.06.19
09:19
(43) Ну в случае с другими источниками данных (сторонние СУБД) этот вопрос же как-то решается. Там тоже может быть несколько серверов БД в кластере.
45 Василий Алибабаевич
 
11.06.19
09:24
(42) Что вам даст время изменения записи? Важно знать что после _последнего_ _вашего_ чтения они изменились. И какая разница сколько раз? А тем более в каком порядке? Перечитать промежуточное состояние не получится. Да оно и не нужно в реляционных данных.
46 mistеr
 
11.06.19
09:24
(44) Где именно он решается? Ты про 1С или что?
47 Cyberhawk
 
11.06.19
09:26
(45) Ну так в твоем случае чтобы понять что запись изменилась нужно пробежаться по _всей_ таблице и сравнивать. А в случае со штампом времени на запрос выборки накладывается фильтр и если это поле индексируемое, то получается профит.
48 Cyberhawk
 
11.06.19
09:26
(46) "в случае с другими источниками данных (сторонние СУБД)" решается. Не про 1С конечно же - про СУБД.
49 Василий Алибабаевич
 
11.06.19
09:29
(47) "нужно пробежаться по _всей_ таблице". Абсолютно не нужно. Нужно сравнить номер версии "у меня на руках" и в таблице. И если они разные - я буду знать что запись изменилась.
50 Cyberhawk
 
11.06.19
09:31
(49) Ну так задача-то - это выбрать все измененные записи, а не проверить что какая-то одна изменилась.
51 Василий Алибабаевич
 
11.06.19
09:34
(50) Это зависит от архитектуры. Я например не представляю (или плохо представляю) насколько нужно денормализовать таблицу, что б данные об одном объекте были в нескольких записях. Обычно это все-таки одна запись.
52 mistеr
 
11.06.19
09:40
(48) На уровне СУБД решается тоже сложно. Например, специальный сервис следит за точной синхронизацией времени на узлах. Желательно по отдельному каналу связи.

Кстати, задача "выбрать все изменения с момента последней репликации" решается в СУБД примерно так же, как с планом обмена. Так что пользуйся и не ворчи.
53 Cyberhawk
 
11.06.19
09:41
(51) Так никто про "об одном объекте" и не говорит - задача получать все объекты, измененные с последней итерации засасывания
54 Cyberhawk
 
11.06.19
09:44
(52) Вообще так-то понятно, почему ребятки из 1С не хранят там какое-то точное время: потому что какую бы маленькую гранулу не делать, всегда может быть так что объект будет за этот минимальный интервал изменен не один раз. Я в общем-то про хранение точного штампа и не просил в (38), а лишь про гарантированный порядок (чтобы опять-таки выборка быстрой была за счет работы индекса)
55 mistеr
 
11.06.19
09:48
(54) Какой еще нафиг индекс? :))
56 Cyberhawk
 
11.06.19
09:50
(55) По упорядочиваемому полю, см. (47)
57 Василий Алибабаевич
 
11.06.19
09:51
(55) Чтобы быстро искать поле в строке ))).
Не ну а че? Запись в таблице по индексу можно. А поле в записи нет? )))
58 Cyberhawk
 
11.06.19
09:53
(57) Пример задачи описан в (42) и повторен тебе в (50). Но ты почему-то пытаешься "съехать" с темы, так что пока складывается впечатление, что ты либо бакланишь, либо троллишь.
59 mistеr
 
11.06.19
09:56
(56) Блин, начинается...
Еще один индекс гарантированно ухудшает время отклика (его, в отличие от других индексов, нужно обновлять всегда). А insert в таблицу изменений дешевле. Все придумано до нас, и не просто так.
60 Василий Алибабаевич
 
11.06.19
09:59
(58) А-а-а... Вы здесь о своем? А я думал - о блокировках, чистом и грязном чтении, отметках версий... А оно вон оно как...
61 Cyberhawk
 
11.06.19
10:01
(59) Довод конечно же принимается, но вот по ссылкой же (УИДом), получаемой через менеджер объекта метаданных (а не просто через конструктор), сделали по факту то же самое - он уникален и упорядочен. Твой посыл из (37) сразу был ясен )
62 Cyberhawk
 
11.06.19
10:02
(60) Я уже хз кто тут о чем )
63 mistеr
 
11.06.19
10:13
(61) Упорядоченность во времени не гарантируется. И по-моему, не используется (платформой).
64 Cyberhawk
 
11.06.19
10:18
(63) Все так. Мой посыл просто исходил из того, что раз это уже сделали, то могли бы сделать еще разок для другого поля. Впрочем, твои аргументы оказались действенными - профит от этого не стоит выделки, да и скрещивание ужа с ежом почти никогда до добра не доводят. Оставим полю "Версия данных" его прямое назначение - быть уникальным в рамках одного ссылочного объекта, и не более того :)
65 mistеr
 
11.06.19
10:22
(64) Скорее всего уид платформа берет просто системной функцией. А [псевдо]упорядоченность там появляется как побочный эффект от обеспечения уникальности.