Название: Многопользовательский доступ к базе данных (MySql) Отправлено: vovan1982 от Июль 12, 2012, 14:51 Привет всем.
Хочу в своей программе сделать многопользовательский доступ. Есть база данных в MySql есть программа которая с этой базой работает. В качестве авторизации в программе используются пользователи MySql. Если одновременно подключиться к базе с разных компьютеров то при обращении к одной и той же строке в таблице естественно будут проблемы. Хочу сделать следующее, запретить редактирование тех строк в таблице которые уже редактируются другими пользователями. Смотрел в сторону стандартных средств MySql но ничего подходящего не нашел, транзакции блокируют всю таблицу целиком, а LOCK IN SHARE MODE блокирует строку только на запись, а мне нужно знать редактирует кто нибудь данную строку или нет, следовательно нужно заблокировать строку на чтение. Думал сделать таблицу блокировок, в которой будут храниться имя таблицы и первичный ключ заблокированной строки, принцип работы предполагал такой, при начале редактирования строки таблицы в программе в таблицу блокировок помещается строка с именем таблицы и первичный ключ, при завершении редактирования эта строка удаляется, но эта таблица теряет смысл в случае аварийного завершения программы потому что строка с блокировкой не удалиться. Если кто нибудь подобное реализовывал поделитесь опытом. Рад буду любым советам по теме. Название: Re: Многопользовательский доступ к базе данных (MySql) Отправлено: JayFOX от Июль 12, 2012, 15:29 Привет.
Я сделал вот как: у "общей" таблицы сделал две колонки "LockedUp" - время, до которого запись заблокирована, и "LockedBy" - кто заблокировал. Тот кто держит запись обновляет поле "LockedUp" каждые, например, 5 минут и продлевает блокировку. Если пользователь отвалился, и время вышло, то другой может без страха открывать на редактирование, а если время не вышло - то придется 5 минут подождать. Название: Re: Многопользовательский доступ к базе данных (MySql) Отправлено: vovan1982 от Июль 12, 2012, 15:47 Привет. Я сделал вот как: у "общей" таблицы сделал две колонки "LockedUp" - время, до которого запись заблокирована, и "LockedBy" - кто заблокировал. Тот кто держит запись обновляет поле "LockedUp" каждые, например, 5 минут и продлевает блокировку. Если пользователь отвалился, и время вышло, то другой может без страха открывать на редактирование, а если время не вышло - то придется 5 минут подождать. Привет. Очень интересный подход, а не нужные записи как чистишь, к примеру время в "LockedUp" вышло 3-и часа назад и строка которую блокировала эта запись уже удалена, следовательно данная строка в таблице блокировок является мусором, как такие строки чистишь? Название: Re: Многопользовательский доступ к базе данных (MySql) Отправлено: kostya2vntu от Июль 12, 2012, 16:07 LOCK IN SHARE MODE + добавить поле LOCKED которое будет устанавливать процесс который заблокировал таблицу на запись, остальные будут его читать и знать что кто-то пишет.
Название: Re: Многопользовательский доступ к базе данных (MySql) Отправлено: JayFOX от Июль 12, 2012, 16:15 Я не в отдельную таблицу блокировки писал, а дополнительные колонки создал в той, где информация нужная. Как только пользователь прочитал или обновил – он же и стирает всю информацию о блокировке.
Название: Re: Многопользовательский доступ к базе данных (MySql) Отправлено: vovan1982 от Июль 12, 2012, 16:25 Спасибо за ответы.
Принцип реализации понятен, пошел реализовывать :). Название: Re: Многопользовательский доступ к базе данных (MySql) Отправлено: vlad-mal от Июль 12, 2012, 21:10 А зачем блокировать-то? ???
Почему нельзя редактировать локальную копию записи? |