Форум: "Базы";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
ВнизDelphi, MySQL и блокировка данных Найти похожие ветки
← →
tanuha (2002-10-08 11:24) [0]Подскажите команду блокировки конкретной строки/записи в
таблице.
С БД одновременно работают и правят данные несколько пользователей. Ситуация: 1-й п. открыл документ и
вносит изменения (пока не сохраняя их), 2-й п. открыл
тотже документ и тоже правит. Кто-то из них сохранит
свои изменения раньше и в результате - оставшемуся
придется править все заново, поскольку контроль идет
только по вып-и update.
← →
Дмитрий Баранов (2002-10-08 13:04) [1]Блокировки на запись в MySQL нет. "Кто-то из них сохранит
свои изменения раньше" просто означает, что его SQL-запрос update уйдет раньше. Блокировку можно эмулировать, имхо, только создав промежуточную прослойку (т.е. двузвенка не подходит).
← →
tanuha (2002-10-08 13:46) [2]А можно поконкретнее о "промежуточной прослойке" ?
← →
SergSuper (2002-10-08 14:00) [3]Собственно в серверах, которые поддерживают блокировки, они(блокировки) предназначены несколько для другого - для обеспечения целостности данных на уровне записей(если совсем грубо). То что Вы хотите - это не уже работа на уровне документов, т.е. на каком-то логическом уровне. Вам придётся самому вести таблицу, в которой отслеживать какие документы в каком состоянии находятся и уже на клиенткой части решать в соответствии с этими состояниями разрешать пользователю вносить исправления или нет.
← →
fidget (2002-10-08 14:45) [4]ты можешь заблокировать отдельные записи в MySQL, только если исчпользуешь таблицы InnoDB
тогда просто SELECT .. FOR UPDATE/LOCK IN SHARE MODE
← →
Дмитрий Баранов (2002-10-08 14:50) [5]> SergSuper (08.10.02 14:00)
Или так, тоже вариант.
> tanuha (08.10.02 13:46)
Обычная технология - пишется сервер, и только он напрямую работает с СУБД, а клиентские приложения общаются с сервером, предоставляющим какой=то интерфейс. В таком случае логика выносится на сервер, а не на клиента ( т.е. в данном случае он может решать - отдавать запись на редактирование второму клиенту или нет). А технологии для создания трехзвенок всяко разные есть, я, например, COM-MTS люблю.
← →
Nikolay M. (2002-10-08 17:57) [6]Внесу свое скромное мнение - я в этой ситуации мог позволить себе завести два поля в редактируемой таблице (небольшой справочник): lock_user_name и lock_start_time. Понятно, что при открытии НД на редактирование в них записывались соответственно логин юзера и текущее время. При попытке отредактировать заблокированную запись выдавалось сообщение, что запись заблокирована таким-то пользователем, автоматическая разблокировка произойдет через эннадцать минут, пока запись открыта только на просмотр. + еще в нужном месте поставить через некоторое время автоматическую разблокировку, скажем через 20 минут, чтобы записи не повисали в readonly.
← →
tanuha (2002-10-09 13:41) [7]Для меня наиболее приемлимы способы Nikolay"я и
SergSuper, поскольку понятно как реализовать.
Вариант fidget, тоже попробую, как только
разберусь с чем едят innoDB, сейчас у меня
тип табл. MyISAM, тот что по-умолчанию.
Всем спасибо.
← →
Дед Макар (2002-10-09 13:58) [8]innodb-таблицы поддерживают транзакции и в последних версиях вроде бы еще есть foreign keys. Не уверен, что с помощью этих двух пунктов получится решить проблему.
← →
fidget (2002-10-09 15:24) [9]почему?
например
если ты открываешь транзакцию и делаешь
select ... where [some condition] for update
т.е. выбираешь инфу по какой-то записи для редактирования
то до тех пор пока не произойдет COMMIT или ROLLBACK другой не сможет выбрать эту запись.
в mySQL"е есть еще такая функция как GET_LOCK(), я правда не очень поняла как она работает :(
← →
Дед Макар (2002-10-09 17:44) [10]
> fidget © (09.10.02 15:24)
select ... where [some condition] for update
не знаю, так не делал
возможно, что это и есть то, что нужно.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c