|
|
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Дано: Файл-сервер. База данных на файл-сервере. Куча юзеров. Найти: Блокировка редактируемой записи для других юзеров. Я на Delphi пишу приложение, которое обращается к БД Access 97, но интересно как это будет выглядеть его родными его средствами. Покажите краткий пример PLS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 10:46 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Поиском "блокировок" занимается ядро базы данных - если запись заблокирована, то юзер, котрый хочет ее изменить, будет получать ошибку, которую можно отлавить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 11:04 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Поиском "блокировок" занимается ядро базы данных - если запись заблокирована, то юзер, котрый хочет ее изменить, будет получать ошибку, которую можно отлавить. А как в Access'e установить оптимистическую/писимистическую блокировку ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:08 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
>А как в Access'e установить оптимистическую/писимистическую блокировку ? Смотря где ты хочешь ее устанавливать и главное КАК ты из дельфи будешь работаь (если ADO - то через него и ставь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:18 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Прикол в том, что вся система через BDE сделана... При редактировании одной записи 2-мя людьми срабатывает оптимистическая(молчит), кто последний нажал бновить, такие и данные... С Paradox'ом все проще, там сразу он исключительную ситуацию генерить.. Чего делать-то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:26 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
>Прикол в том, что вся система через BDE сделана... >При редактировании одной записи 2-мя людьми срабатывает оптимистическая >(молчит), кто последний нажал бновить, такие и данные... Ты как привязываешь данные к своей форме? Через что? ADO? Там есть тип блокировки. Указывай его явно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:29 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Через что? ADO? Там есть тип блокировки. Указывай его явно Нет, через DAO... TTable. Может какой нибудь макрос написать нужно... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 11:09 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Если через DAO, то видимо все-таки через рекордсет. Вот у него при открытии и указывай тип блокировки. Не знаю, как в дельфи, а в VB что-нибудь типа Код: plaintext кто последний нажал бновить, такие и данные... А вот это совсем странно. В аксесе ругается на то, что данные были изменены другим пользователем. Это похоже на отсутствие блокировки ваапсче, но ведь так не бывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 11:22 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
кто последний нажал бновить, такие и данные... А вот это совсем странно. В аксесе ругается на то, что данные были изменены другим пользователем. Это похоже на отсутствие блокировки ваапсче, но ведь так не бывает? 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 11:42 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Попробую похожим способом..... Результат сообщу.. Всем большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 11:53 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
2 am (a_mitin) Работаем через DAO Если открыть два рекордсета с оптимистической блокировкой, начать их редактировать (режим позволяет), а потом обоим сказать Update - первый отработает нормально, а второй обломится. Будет ругань как раз на блокировку. Так что блокировка налагается в момент вызова .Update, а снимается после .Update только если никто больше не читает эти записи . Если же кто-то в момент завершения Update читает измененные записи, то какая-то блокировка остается. Вроде так. Хотя экперименты проводил уже года три назад, может чего и забыл. Если что - поправьте. Экспериметировал с рекордсетами в режиме dbOpenDynaset, может в других режимах оно и по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 11:55 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
2ЛП: DAO не стал проверять - проверил то, что я говорил - ADODB.Recordset. Оказывается, говоря: И при работе через ADO если не предпринимать таких же мер (сравнение старых данных с текущими данными на сервере) ... я ошибался - самому таких мер предпринимать не надо - ADOшный рекордсет тоже их предпринимает сам :). Как это работает - (по инфе из MSDN - статья Rob Macdonald "An Update on Updating") - при выполнении изменения через рекордсет: Код: plaintext 1. 2. реально на SQL Server уходит запрос: UPDATE "Customers" SET "ContactName"= НОВОЕЗНАЧЕНИЕ WHERE "CustomerID"= ? AND "ContactName"= СТАРОЕЗНАЧЕНИЕ и в случае, если старое значение поля ContactName изменилось - то просто запись не находится и выдается сообщение об ошибке: Код: plaintext 1. вот такая вот механизма ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 12:33 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Проверил через DAO-шные рекордсеты. Открыл два одинаковых с оптимистической блокировкой, встал на одну и ту же запись, обоим сказал Edit, изменил занчение, обоим сказал Update. При втором Update выдало "Процесс остановлен ядром Jet так так другой пользователь изменил те же данные и т.п.". В сообщении об ошибке блокировка не упоминается, но скорее всего это она. Можно еще поиграть со смесью оптимистической и пессимистической блокировок, да еще и транзакции приплести. В общем, должно DAO (Jet) само отслеживать такие ситуации. Если в дельфях BDE этого не делает - ну тады вопрос к борланду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 13:38 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
В сообщении об ошибке блокировка не упоминается, но скорее всего это она. :) Скорей всего нет - не она. Это не блокировка, а просто проверка, которую выполняет сам объект 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 14:29 |
|
||
|
Блокировка записи в многоюзерском режиме
|
|||
|---|---|---|---|
|
#18+
Блокировок на сервере (или в ldb для mdb с данными) после Update не остаётся Ок. Был неправ. Это не блокировка. Это действительно проверка самого DAO или Jet. Но, в конечном итоге, " результат достигнут и в общем то неважно за счет чего " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 14:40 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32203004&tid=1680591]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 188ms |
| total: | 307ms |

| 0 / 0 |
