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

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

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

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

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

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

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


кто последний нажал бновить, такие и данные...
А вот это совсем странно. В аксесе ругается на то, что данные были изменены другим пользователем. Это похоже на отсутствие блокировки ваапсче, но ведь так не бывает?
...
Рейтинг: 0 / 0
Блокировка записи в многоюзерском режиме
    #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
Блокировка записи в многоюзерском режиме
    #32205400
Андрей GR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую похожим способом..... Результат сообщу..
Всем большое спасибо!
...
Рейтинг: 0 / 0
Блокировка записи в многоюзерском режиме
    #32205402
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 am (a_mitin)

Работаем через DAO
Если открыть два рекордсета с оптимистической блокировкой, начать их редактировать (режим позволяет), а потом обоим сказать Update - первый отработает нормально, а второй обломится. Будет ругань как раз на блокировку. Так что блокировка налагается в момент вызова .Update, а снимается после .Update только если никто больше не читает эти записи . Если же кто-то в момент завершения Update читает измененные записи, то какая-то блокировка остается.
Вроде так. Хотя экперименты проводил уже года три назад, может чего и забыл. Если что - поправьте.
Экспериметировал с рекордсетами в режиме dbOpenDynaset, может в других режимах оно и по другому.
...
Рейтинг: 0 / 0
Блокировка записи в многоюзерском режиме
    #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
Блокировка записи в многоюзерском режиме
    #32205585
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил через DAO-шные рекордсеты. Открыл два одинаковых с оптимистической блокировкой, встал на одну и ту же запись, обоим сказал Edit, изменил занчение, обоим сказал Update. При втором Update выдало "Процесс остановлен ядром Jet так так другой пользователь изменил те же данные и т.п.". В сообщении об ошибке блокировка не упоминается, но скорее всего это она. Можно еще поиграть со смесью оптимистической и пессимистической блокировок, да еще и транзакции приплести.
В общем, должно DAO (Jet) само отслеживать такие ситуации. Если в дельфях BDE этого не делает - ну тады вопрос к борланду.
...
Рейтинг: 0 / 0
Блокировка записи в многоюзерском режиме
    #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
Блокировка записи в многоюзерском режиме
    #32205710
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блокировок на сервере (или в ldb для mdb с данными) после Update не остаётся
Ок. Был неправ. Это не блокировка. Это действительно проверка самого DAO или Jet. Но, в конечном итоге, " результат достигнут и в общем то неважно за счет чего "
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка записи в многоюзерском режиме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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