Russian Qt Forum
Сентябрь 30, 2024, 02:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Многопользовательский доступ к базе данных (MySql)  (Прочитано 6281 раз)
vovan1982
Гость
« : Июль 12, 2012, 14:51 »

Привет всем.

Хочу в своей программе сделать многопользовательский доступ.
Есть база данных в MySql есть программа которая с этой базой работает.
В качестве авторизации в программе используются пользователи MySql.
Если одновременно подключиться к базе с разных компьютеров то при обращении к  одной и той же строке в таблице естественно будут проблемы.

Хочу сделать следующее, запретить редактирование тех строк в таблице которые уже редактируются другими пользователями.

Смотрел в сторону стандартных средств MySql но ничего подходящего не нашел, транзакции блокируют всю таблицу целиком, а LOCK IN SHARE MODE блокирует строку только на запись, а мне нужно знать редактирует кто нибудь данную строку или нет, следовательно нужно заблокировать строку на чтение.

Думал сделать таблицу блокировок, в которой будут храниться имя таблицы и первичный ключ заблокированной строки, принцип работы предполагал такой, при начале редактирования строки таблицы в программе в таблицу блокировок помещается строка с именем таблицы и первичный ключ, при завершении редактирования эта строка удаляется, но эта таблица теряет смысл в случае аварийного завершения программы потому что строка с блокировкой не удалиться.

Если кто нибудь подобное реализовывал поделитесь опытом.
Рад буду любым советам по теме.
Записан
JayFOX
Гость
« Ответ #1 : Июль 12, 2012, 15:29 »

Привет.

Я сделал вот как: у "общей" таблицы сделал две колонки "LockedUp" - время, до которого запись заблокирована, и "LockedBy" - кто заблокировал. Тот кто держит запись обновляет поле "LockedUp" каждые, например, 5 минут и продлевает блокировку. Если пользователь отвалился, и время вышло, то другой может без страха открывать на редактирование, а если время не вышло - то придется 5 минут подождать.
Записан
vovan1982
Гость
« Ответ #2 : Июль 12, 2012, 15:47 »

Привет.

Я сделал вот как: у "общей" таблицы сделал две колонки "LockedUp" - время, до которого запись заблокирована, и "LockedBy" - кто заблокировал. Тот кто держит запись обновляет поле "LockedUp" каждые, например, 5 минут и продлевает блокировку. Если пользователь отвалился, и время вышло, то другой может без страха открывать на редактирование, а если время не вышло - то придется 5 минут подождать.

Привет.

Очень интересный подход, а не нужные записи как чистишь, к примеру время в "LockedUp" вышло 3-и часа назад и строка которую блокировала эта запись уже удалена, следовательно данная строка в таблице блокировок является мусором, как такие строки чистишь?
Записан
kostya2vntu
Гость
« Ответ #3 : Июль 12, 2012, 16:07 »

LOCK IN SHARE MODE + добавить поле LOCKED которое будет устанавливать процесс который заблокировал таблицу на запись, остальные будут его читать и знать что кто-то пишет.
Записан
JayFOX
Гость
« Ответ #4 : Июль 12, 2012, 16:15 »

Я не в отдельную таблицу блокировки писал, а дополнительные колонки создал в той, где информация нужная. Как только пользователь прочитал или обновил – он же и стирает всю информацию о блокировке.
Записан
vovan1982
Гость
« Ответ #5 : Июль 12, 2012, 16:25 »

Спасибо за ответы.

Принцип реализации понятен, пошел реализовывать  Улыбающийся.
Записан
vlad-mal
Гость
« Ответ #6 : Июль 12, 2012, 21:10 »

А зачем блокировать-то?  Непонимающий
Почему нельзя редактировать локальную копию записи?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.