Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка записи в многоюзерском режиме / 15 сообщений из 15, страница 1 из 1
09.07.2003, 10:46
    #32202820
Андрей GR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Дано:
Файл-сервер.
База данных на файл-сервере.
Куча юзеров.

Найти:
Блокировка редактируемой записи для других юзеров.

Я на Delphi пишу приложение, которое обращается к БД Access 97, но интересно как это будет выглядеть его родными его средствами.

Покажите краткий пример PLS.
...
Рейтинг: 0 / 0
09.07.2003, 11:04
    #32202851
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Поиском "блокировок" занимается ядро базы данных - если запись заблокирована, то юзер, котрый хочет ее изменить, будет получать ошибку, которую можно отлавить.
...
Рейтинг: 0 / 0
09.07.2003, 12:08
    #32203004
Андрей GR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Поиском "блокировок" занимается ядро базы данных - если запись заблокирована, то юзер, котрый хочет ее изменить, будет получать ошибку, которую можно отлавить.

А как в Access'e установить оптимистическую/писимистическую блокировку ?
...
Рейтинг: 0 / 0
09.07.2003, 12:18
    #32203020
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
>А как в Access'e установить оптимистическую/писимистическую блокировку ?

Смотря где ты хочешь ее устанавливать и главное КАК ты из дельфи будешь работаь (если ADO - то через него и ставь)
...
Рейтинг: 0 / 0
09.07.2003, 12:26
    #32203038
Андрей GR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Прикол в том, что вся система через BDE сделана...
При редактировании одной записи 2-мя людьми срабатывает оптимистическая(молчит), кто последний нажал бновить, такие и данные...
С Paradox'ом все проще, там сразу он исключительную ситуацию генерить..
Чего делать-то ?
...
Рейтинг: 0 / 0
09.07.2003, 12:29
    #32203040
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
>Прикол в том, что вся система через BDE сделана...
>При редактировании одной записи 2-мя людьми срабатывает оптимистическая
>(молчит), кто последний нажал бновить, такие и данные...

Ты как привязываешь данные к своей форме?
Через что? ADO? Там есть тип блокировки. Указывай его явно
...
Рейтинг: 0 / 0
11.07.2003, 11:09
    #32205320
Андрей GR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Через что? ADO? Там есть тип блокировки. Указывай его явно
Нет, через DAO... TTable.
Может какой нибудь макрос написать нужно... ?
...
Рейтинг: 0 / 0
11.07.2003, 11:22
    #32205336
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Если через DAO, то видимо все-таки через рекордсет. Вот у него при открытии и указывай тип блокировки. Не знаю, как в дельфи, а в VB что-нибудь типа
Код: plaintext
OpenRecordset блаблабла..., LockEdits:=dbPessimistic


кто последний нажал бновить, такие и данные...
А вот это совсем странно. В аксесе ругается на то, что данные были изменены другим пользователем. Это похоже на отсутствие блокировки ваапсче, но ведь так не бывает?
...
Рейтинг: 0 / 0
11.07.2003, 11:42
    #32205373
am (a_mitin)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
кто последний нажал бновить, такие и данные...
А вот это совсем странно. В аксесе ругается на то, что данные были изменены другим пользователем. Это похоже на отсутствие блокировки ваапсче, но ведь так не бывает?

Access ругается потому что он запоминает состояние записи при её считывании в форму и при обновлении сравнивает то что считал с тем что в базе и ругается если находит отличия. Блокировка на уровне данных здесь не при чем. И при работе через ADO если не предпринимать таких же мер (сравнение старых данных с текущими данными на сервере) Андрей абсолютно прав - кто последний сохранит того и данные. И блокировки - они есть. Только налагаются на короткое время (как и должно быть) - если LockEdits:=dbOptimistic то блокировка на изменяемые данные налогается в момент вызова метода .Update и сразу после сохранения снимается- если LockEdits:=dbPessimistic - то в момент вызова .Edit (такого метода в ADODB.Recordset уже нет, я имею ввиду - в момент начала редактирования данных) и удерживается до вызова метода .Update.
А вообще имхо с такого рода блокировками надо бороться потому как это снижает возможность парралельной работы многих пользователей, а очереди организовывать другими методами. Например с пом. sp_getapplock в MsSQL Server 2000 (или написать аналоги для более ранних версий или для mdb). Главное при организации такого рода блокировок незабыть реализовать механизм снятия блокировки в случае если пользователь неожиданно "отвалился" от базы (ну комп выключил кнопкой пауер).
Вот здесь эта тема обсуждалась:
Аналог процедур sp_getapplock и sp_releaseapplock для Ms SQL Server 7.0
...
Рейтинг: 0 / 0
11.07.2003, 11:53
    #32205400
Андрей GR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Попробую похожим способом..... Результат сообщу..
Всем большое спасибо!
...
Рейтинг: 0 / 0
11.07.2003, 11:55
    #32205402
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
2 am (a_mitin)

Работаем через DAO
Если открыть два рекордсета с оптимистической блокировкой, начать их редактировать (режим позволяет), а потом обоим сказать Update - первый отработает нормально, а второй обломится. Будет ругань как раз на блокировку. Так что блокировка налагается в момент вызова .Update, а снимается после .Update только если никто больше не читает эти записи . Если же кто-то в момент завершения Update читает измененные записи, то какая-то блокировка остается.
Вроде так. Хотя экперименты проводил уже года три назад, может чего и забыл. Если что - поправьте.
Экспериметировал с рекордсетами в режиме dbOpenDynaset, может в других режимах оно и по другому.
...
Рейтинг: 0 / 0
11.07.2003, 12:33
    #32205453
am (a_mitin)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
2ЛП:
DAO не стал проверять - проверил то, что я говорил - ADODB.Recordset. Оказывается, говоря: И при работе через ADO если не предпринимать таких же мер (сравнение старых данных с текущими данными на сервере) ... я ошибался - самому таких мер предпринимать не надо - ADOшный рекордсет тоже их предпринимает сам :). Как это работает - (по инфе из MSDN - статья Rob Macdonald "An Update on Updating") - при выполнении изменения через рекордсет:
Код: plaintext
1.
2.
Print rs!ContactName
rs.Update  "ContactName" ,  "Jeff Archer" 
Print rs!ContactName

реально на SQL Server уходит запрос:
UPDATE "Customers" SET "ContactName"= НОВОЕЗНАЧЕНИЕ
WHERE "CustomerID"= ? AND "ContactName"= СТАРОЕЗНАЧЕНИЕ
и в случае, если старое значение поля ContactName изменилось - то просто запись не находится и выдается сообщение об ошибке:
Код: plaintext
1.
- 2147217864  Row cannot be located for updating. Some
values may have been changed since it was last read.

вот такая вот механизма ;)
...
Рейтинг: 0 / 0
11.07.2003, 13:38
    #32205585
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Проверил через DAO-шные рекордсеты. Открыл два одинаковых с оптимистической блокировкой, встал на одну и ту же запись, обоим сказал Edit, изменил занчение, обоим сказал Update. При втором Update выдало "Процесс остановлен ядром Jet так так другой пользователь изменил те же данные и т.п.". В сообщении об ошибке блокировка не упоминается, но скорее всего это она. Можно еще поиграть со смесью оптимистической и пессимистической блокировок, да еще и транзакции приплести.
В общем, должно DAO (Jet) само отслеживать такие ситуации. Если в дельфях BDE этого не делает - ну тады вопрос к борланду.
...
Рейтинг: 0 / 0
11.07.2003, 14:29
    #32205687
am (a_mitin)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
В сообщении об ошибке блокировка не упоминается, но скорее всего это она.
:)
Скорей всего нет - не она. Это не блокировка, а просто проверка, которую выполняет сам объект Recordset перед обновлением. Блокировок на сервере (или в ldb для mdb с данными) после Update не остаётся. Они существуют короткое время (при оптимистической блокировке).
вот из тогоже MSDN:
adLockOptimistic - Indicates optimistic locking, record by record. The provider uses optimistic locking, locking records only when you call the Update method.
adLockPessimistic - Indicates pessimistic locking, record by record. The provider does what is necessary to ensure successful editing of the records, usually by locking records at the data source immediately after editing.
В общем, должно DAO (Jet) само отслеживать такие ситуации. Если в дельфях BDE этого не делает - ну тады вопрос к борланду.
Да, соглашусь, если объект перед обновлением выдает сообщение о том, что с момента считывания данные изменились - результат достигнут и в общем то неважно за счет чего - за счет блокировок или за счет сравнения считанных данных с данными на сервере в момент обновления.
(хотя немного всётаки важно - например проверка может не сработать или занять много времени если в таблице есть несколько полей типа Text, Image. Зная механизм в этих случаях можно облегчить жизнь рекордсету, добавив в таблицу поле типа TimeStamp - в случае его наличия проверка изменения будет производиться по нему (сам не проверял, но судя по всему это так)).
ЗЫ: я про случай, если данные находятся на Ms SQL Server.
...
Рейтинг: 0 / 0
11.07.2003, 14:40
    #32205710
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записи в многоюзерском режиме
Блокировок на сервере (или в ldb для mdb с данными) после Update не остаётся
Ок. Был неправ. Это не блокировка. Это действительно проверка самого DAO или Jet. Но, в конечном итоге, " результат достигнут и в общем то неважно за счет чего "
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка записи в многоюзерском режиме / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]