Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.46 MB
Время: 0.009 c
1-101333
brestmarket
2002-10-20 16:35
2002.10.31
Как записать программу на CD, чтобы ее нельзя было скопировать?


3-101059
Sago
2002-10-07 05:58
2002.10.31
Базу в ресурсы


1-101262
Yakimaha
2002-10-22 12:30
2002.10.31
Отчет в Word


4-101595
Diamond Cat
2002-09-17 01:33
2002.10.31
Регионы


6-101415
Diamus
2002-08-30 15:32
2002.10.31
Проблема с обрывом соединения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский