Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / блокирование записей в многопользовательском режиме / 21 сообщений из 21, страница 1 из 1
18.02.2016, 08:00
    #39173729
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Всем доброго дня! Прошу сильно не пинать за вопросы :)
Имеется проект Дельфи+firebird, который теперь переходит на многопользовательский режим, достался в наследство.
В справочниках, диалоговые окна редактирования содержат по два FIBTransaction - один на чтение записей (read, nowait, rec_version, read_committed), второй на изменение (write, nowait, rec_version, read_committed).
То есть при нажатии на кнопку "Изменить" срабатывает GET, выполняется процедура, вытаскиваются данные, затем CommitRetaining.
Если менялись какие-либо данные, то срабатывает UPD, выполняется процедура и Commit.

При таком раскладе как-то можно добиться блокировки записей? Счс она не работает, два приложения могут редактировать данные одновременно.

Я попробовал поставить в процедуре GET "select for update with lock", но тогда возникает ошибка - "попытка изменить данные при чтении".

Я сделал так - транзакцию в GET поменял на транзакцию UPD. То есть оба FIBStoredProc счс ссылаются на транзакцию UPD(write, nowait, rec_version, read_committed), и убрал CommitRetaining при чтении данных, теперь Commit срабатывает только при нажатии на кнопку ОК.
И тогда блокировка срабатывает, т.е. если данная запись открыта в одном приложении, во втором при просмотре данной записи возникает ошибка.

Я все сделал правильно? Может что-то упустил, или данный способ чреват подводными камнями?
...
Рейтинг: 0 / 0
18.02.2016, 08:35
    #39173738
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
и что тогда делать, если пользователь просто решил просмотреть запись? Ведь просматривать он ее может сколь угодно долго
...
Рейтинг: 0 / 0
18.02.2016, 10:54
    #39173859
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
aidynchik...Счс она не работает, два приложения могут редактировать данные одновременно.


Пусть. Абсолютно ничего страшного.
В смысле: забей.
...
Рейтинг: 0 / 0
18.02.2016, 11:46
    #39173933
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
ZeroMQ,

ну как, один ввел одни данные, а второй - другие... потом же концов не найдут почему так произошло и то что вводил он, стало совсем другим
...
Рейтинг: 0 / 0
18.02.2016, 11:48
    #39173937
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Hello, Zeromq!
You wrote on 18 февраля 2016 г. 11:48:33:

Zeromq> Пусть. Абсолютно ничего страшного.
> В смысле: забей.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 12:04
    #39173959
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Мимопроходящий,

дельного совета не дадите?
...
Рейтинг: 0 / 0
18.02.2016, 12:06
    #39173966
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Hello, Aidynchik!
You wrote on 18 февраля 2016 г. 12:05:58:

Aidynchik> дельного совета не дадите? http://ibase.ru/devinfo/pslock.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 12:33
    #39173988
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Мимопроходящий,

я читал это 100 раз, но так и не понял как сделать блокировку так, чтобы пользователь 2 не мог корректировать, но мог просматривать запись пока пользователь 1 ее редактирует (то есть нажал кнопку "Изменить" и набивает данные).

Правильно ли я мыслю - мне надо иметь 3 FibStoredProc: 1 - это для просмотра записи, где будет селект без WITH LOCK, 2 - для просмотра записи, который будет запускаться по нажатию на кнопку "Изменить", где селект WITH LOCK, и 3 - это на сам апдейт.

1-ый будет именть транзакцию строго на чтение, 2 других - на редактирование.
И мне придется иметь 2 варианта процедуры с селектами с WITH LOCK и без него?

Неужто все так сложно?
...
Рейтинг: 0 / 0
18.02.2016, 12:40
    #39173997
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
"просмотр" - это одна операция,
"блокирование" и "редактирование" - другая.
из этого и исходи.

использовать ли SELECT ... WITH LOCK, или же "холостой" UPDATE - выбирай сам.
если у тебя хитрозамороченных триггеров нет, можно обойтись одним UPDATE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 12:46
    #39174004
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Мимопроходящий,

сорри, что тупо догоняю, но все же...
счс у меня процедура просмотра данных одна (без LOCK соответственно) и вызывается она что при просмотре, что при редактировании.
То есть мне надо разделить ее на 2 процедуры без LOCK - для просмотра, и с LOCK - для редактирования, правильно?
...
Рейтинг: 0 / 0
18.02.2016, 12:57
    #39174025
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
я не понимаю зачем ты тривиальные действия обёртываешь процедурами.
утрируя, на уровне GUI, блокировка должна выставляться (пытаться выставляться)
при нажатии на кнопку "изменить".
с процедурой, без процедуры - не имеет значения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 12:57
    #39174026
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
aidynchikодин ввел одни данные, а второй - другие... потом же концов не найдут
почему так произошло и то что вводил он, стало совсем другим
Что значит "концов не найдут"? Станут кричать "кто сидел на моём стуле поменял мои
данные?", второй пользователь-то и признается. Ты можешь автоматизировать этот процесс
ведя журнал изменений документов. В чём проблема-то? Нет никакой разницы между
редактированием ими данных одновременно или с разницей в полчаса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 12:58
    #39174027
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
aidynchik,

читай статью еще 100 раз. только не через слово, а подробно и медленно.
...
Рейтинг: 0 / 0
18.02.2016, 13:14
    #39174055
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Мимопроходящий,

просто пытаюсь понять, как это технически реализовать :)

всем спасибо за советы
...
Рейтинг: 0 / 0
18.02.2016, 13:16
    #39174058
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
aidynchikпросто пытаюсь понять, как это технически реализовать :)
Протоколом изменений. Или проверкой не изменилась ли запись с начала её редактирования в GUI.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 13:49
    #39174132
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Dimitry Sibiryakov,

можно еще и сообщениями обмениваться через firebird

переводишь форму в режим редактирования - всем POST_EVENT про это
и обратно

что-то типа многопроцессорного кэша но сильно проще ( не нужны данные, а только сам факт редактирования )
...
Рейтинг: 0 / 0
18.02.2016, 13:58
    #39174158
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
aidynchikZeroMQ,

ну как, один ввел одни данные, а второй - другие... потом же концов не найдут почему так произошло и то что вводил он, стало совсем другим

А с блокировками - что изменится? :)
...
Просто заворачивай логические операции изменений документа в одну транзакцию, и все. Или документ изменился/удалился, или нет.
...
Рейтинг: 0 / 0
18.02.2016, 14:00
    #39174165
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Arioch...

переводишь форму в режим редактирования - всем POST_EVENT про это
и обратно
...

Открыл форму "на редактирование" и пошел обедать...
...
Рейтинг: 0 / 0
18.02.2016, 14:26
    #39174225
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
ZeroMQ,

одинаковая проблема при любой схеме блокировок

обед ещё фигня - а вот когда домой уходят вечером...

тут либо не блокировать вообще, либо блокировать выбор, а я просто предложил вариант реализации блокировок
...
Рейтинг: 0 / 0
18.02.2016, 16:09
    #39174458
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
aidynchikпросто пытаюсь понять, как это технически реализовать :)Реализуй сначала логически, на бумаге. Если административно схема вменяема, то технически реализовать ее на файрберде можно.
...
Рейтинг: 0 / 0
26.02.2016, 08:35
    #39179486
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокирование записей в многопользовательском режиме
Например так можно:
В таблицу добавляется поле Version, которое заполняется из генератора на создание и обновление записи.
При чтении запоминаешь версию.
Перед сохранением изменений ты открываешь транзакцию и первым делом читаешь значение версии.
Если оно равно прошлому - значит изменений не было и можно смело писать.
Если другое - стало быть кто-то уже успел изменить.
Если прочитать ничего не удалось - значит запись удалили.
В последних 2х случаях нужно, что-то сообщить об этом пользователю. :)

Для того чтобы понять кто именно изменил, нужно ещё поле с id пользователя.
Для того чтобы отследить когда изменили - поле с датой-временем изменения.
Если нужны эти данные об удалённых записях - делаем доп. таблицу и заполняем в триггере after delete

Можно что-то и более навороченное накрутить, но это по от задач зависит. :)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / блокирование записей в многопользовательском режиме / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]