Russian Qt Forum

Qt => Базы данных => Тема начата: vovan1982 от Июль 12, 2012, 14:51



Название: Многопользовательский доступ к базе данных (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
А зачем блокировать-то?  ???
Почему нельзя редактировать локальную копию записи?