Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Спортивная новогодняя задачка на блокировки  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1194
Если есть переменная
^Data(id)
то ее можно заблокировать на запись
lock ^Data(id)
и на чтение
lock ^Data(id,$job)
Либо один пишущий, либо много читающих.

Вопрос - как сделать блокировку, чтобы можно было взять на чтение набор данных?
Дополнительные разрешенные состояния:
* только один пишет в запись, никто не может брать на чтение набор, но может брать на чтение или на запись другие записи
* многие берут на чтение набор, запрещая брать на запись отдельные записи, но разрешая брать на чтение отдельные записи
27 дек 18, 11:54    [21774622]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3809
Ээм. Евгений Каратаев дал кому-то попользоваться своей учеткой?
Мне даже неудобно писать, но блокировка не запрещает ни чтение, ни запись, только другую блокировку.
По вопросу, мне кажется, shared look делает то, что вам нужно. И не вижу смысла в lock ^Data(id,$job)

Или какой-то подвох, а я ничего не понял, а на самом деле все сложнее?
27 дек 18, 19:08    [21775150]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1566
Я понял задачку именно как предложение реализовать на MUMPSе разделяемую блокировку, или аналогичный механизм, который позволит:
1- нескольким процессам обозначить своё невзаимоисключающее присутствие, если никто не владеет исключительной блокировкой
2- овладеть исключительной блокировкой, если нет никого в состоянии (1).

Чтение/запись - лишь примеры применения. Ясно, что блокировка - это лишь соглашение, и она не препятствует ни тому, ни другому.
28 дек 18, 10:08    [21775465]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3809
А, речь по MUMPS? Значит, на самом деле был подвох
Тогда как там работает блокировка? Как эксклюзивная в Каше? И нужно эмулировать разделяемую блокировку?
Тогда чем не подходит вариант, предложенный Евгением?
28 дек 18, 13:39    [21775703]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1566
Да, в Стандартном M[UMPS] блокировка только исключительная. С помощью такой блокировки не реализовать вот это:
ну я
* многие берут на чтение набор, запрещая брать на запись отдельные записи, но разрешая брать на чтение отдельные записи
так как она не позволяет отметить неисключительное владение ресурсом.
28 дек 18, 14:42    [21775789]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1194
Необязательно с помощью одной. Можно комбинировать две, три, сколько надо. Можно блокировать списком. Необязательно что имена должны соответствовать именам ресурсов, имена блокировок могут быть синтетическими.
28 дек 18, 16:08    [21775907]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
И_я_тоже
Member

Откуда: Stalingradik
Сообщений: 4
Меня тоже несколько обескуражил интерес коллеги Ну_я к вопросу "блокировок на чтение", поскольку это вроде как не его специализация. Кроме того, даже прикладники, как правило, плюют на проблему целостности при "длинном" чтении, хотя прекрасно о ней знают. Поэтому хотелось бы начать с простого.
Команда MERGE. Нужно ли заботиться о блокировке (неизменности) аргумента-источника? Нужно ли заключать эту команду в "транзакционные скобки"?
Транзакционную целостность проверить можно (хотя это муторно и не вполне надёжно). Но проверить неизменность, "защищённость" аргумента во время исполнения MERGE очень затруднительно.
Кто-нибудь что-то может сказать?
PS. И это вопрос как раз по "специализации" коллеги Ну_я.
29 дек 18, 09:51    [21776220]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
И_я_тоже
Member

Откуда: Stalingradik
Сообщений: 4
Именно так! Подпишусь под каждым словом. Но! Это индивидуальная, "штучная" работа в каждом конкретном случае. Универсальных, элегантных и надёжных механизмов я не встречал.
Но сталкивался с ними дважды. Первый способ (радикальный) был предложен и реализован четверть века назад небезызвестным "классиком": монопольный режим (суть понятна из названия). Дёшево и сердито.
Второй механизм был предложен одним из твоих прошлых боссов: работа с копией БД, или её фрагмента. Понятное дело, что такое мероприятие – это "то же самое, только в профиль". Ибо копирование включает в себя упомянутое "длинное" чтение и сути проблемы не меняет.
29 дек 18, 10:18    [21776237]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
experience
Member

Откуда: Новосибирск
Сообщений: 154
И_я_тоже,
Ой, в движке скуль-форума ошибочка нарисовалась это же не первое ваше сообщение, а 2498-е !
29 дек 18, 10:26    [21776239]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1194
И_я_тоже
Команда MERGE. Нужно ли заботиться о блокировке (неизменности) аргумента-источника? Нужно ли заключать эту команду в "транзакционные скобки"?

Команда merge определена по своему поведению в стандарте и поэтому ее менять не следует.
Если менять поведение, то надо вводить другую команду, скажем zmerge, или добавлять опцию, или еще что, но если в коде написано merge, то должен выполняться merge согласно определению.
IMHO если прикладникам надо консистентный merge, то его надо обкладывать блокировками / транзакциями на основе легко понимаемых команд без накрученного скрытого поведения.
29 дек 18, 12:32    [21776312]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
И_я_тоже
Member

Откуда: Stalingradik
Сообщений: 4
experience
...форума ошибочка нарисовалась это же не первое ваше сообщение, а 2498-е !

Не знаю, что там нарисовалось, но пока я пытаюсь всего лишь научиться отвечать на конкретные реплики... И пока побеждает "движок".
29 дек 18, 15:06    [21776462]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
И_я_тоже
Member

Откуда: Stalingradik
Сообщений: 4
ну я
...Команда merge определена по своему поведению в стандарте и поэтому ее менять не следует...

Так я и спрашиваю: как должно быть по стандарту? Является ли команда MERGE "атомарной"? Не случится ли "вклинивания" другого процесса в аргумент-источник, пока он мержится? К сожалению, не смог найти стандарта. Не подскажете, где его отрыть?
ну я
...IMHO если прикладникам надо консистентный merge, то его надо обкладывать блокировками / транзакциями на основе легко понимаемых команд без накрученного скрытого поведения.

Если правильно понял, когда исполняется merge, я должен сам заботиться о целостности результата? Другими словами, merge не является "атомарным"?
29 дек 18, 19:56    [21776610]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1194
И_я_тоже
ну я
...Команда merge определена по своему поведению в стандарте и поэтому ее менять не следует...

Так я и спрашиваю: как должно быть по стандарту? Является ли команда MERGE "атомарной"? Не случится ли "вклинивания" другого процесса в аргумент-источник, пока он мержится? К сожалению, не смог найти стандарта. Не подскажете, где его отрыть?
ну я
...IMHO если прикладникам надо консистентный merge, то его надо обкладывать блокировками / транзакциями на основе легко понимаемых команд без накрученного скрытого поведения.

Если правильно понял, когда исполняется merge, я должен сам заботиться о целостности результата? Другими словами, merge не является "атомарным"?

Дык гугль подскажет
http://71.174.62.16/Demo/AnnoStd
29 дек 18, 20:48    [21776645]     Ответить | Цитировать Сообщить модератору
 Re: Спортивная новогодняя задачка на блокировки  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1194
Блок А.Н.
Ээм. Евгений Каратаев дал кому-то попользоваться своей учеткой?
Мне даже неудобно писать, но блокировка не запрещает ни чтение, ни запись, только другую блокировку.
По вопросу, мне кажется, shared look делает то, что вам нужно. И не вижу смысла в lock ^Data(id,$job)

Или какой-то подвох, а я ничего не понял, а на самом деле все сложнее?

Победителем назначаю пользователя Блок А.Н.
Его ответ наиболее близок к работающему варианту, хотя ожидалось решение на стандартных блокировках.
Действительно, шареная блокировка

lock ^Data#"S"
не дает блокировать на запись ноды

^Data(id)
но дает их блокировать на чтение

lock ^Data(id)#"S"
С наступающим!
30 дек 18, 11:55    [21776838]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить