powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / блокирование записей в многопользовательском режиме
21 сообщений из 21, страница 1 из 1
блокирование записей в многопользовательском режиме
    #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
блокирование записей в многопользовательском режиме
    #39173738
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что тогда делать, если пользователь просто решил просмотреть запись? Ведь просматривать он ее может сколь угодно долго
...
Рейтинг: 0 / 0
блокирование записей в многопользовательском режиме
    #39173859
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik...Счс она не работает, два приложения могут редактировать данные одновременно.


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

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

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

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

дельного совета не дадите?
...
Рейтинг: 0 / 0
блокирование записей в многопользовательском режиме
    #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
блокирование записей в многопользовательском режиме
    #39173988
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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