Re[8]: Вопрос про одновременный доступ
От: MASReady  
Дата: 16.05.06 00:52
Оценка:
Здравствуйте, Sinclair, Вы писали:

...

S>Как реализовать подобное поведение средствами MS SQL Server я знаю — нужно всего лишь покопаться в настройках lock timeout, и применять некоторое шаманство с set transaction isolation level или хинтами в select-ах. Насчет других серверов пришлось бы покопать доки пару дней.


S>Если интересны подробности реалтзации такого щастья для MSSQL — могу написать. Кстати, можно даже отловить, кто именно нас заблокировал (в смысле идентификатор пользователя), и, если применяется WinNT Autentification, то послать ему мессагу через Messenger Service.



Что использую: MS SQL 2005 Express + Delphi DBE
Что делаю: прогу которая пользует базу заведенную в этом самом MSSQL в многопользовательском режиме (с базой будут работать только при помощи моей проги).
Губокого знания транзакций, тригеров и прочей святотени серверов БД не имею, писал раньше в основном однопользовательские проги...

Что Хочется:
1) если один пользователь уже работает с записью, т.е. не просто смотрит, а именно меняет ее, то чтобы другой пользователь при открытии данной записи мог узнать, что над этой записью уже кто-то корпит (и желательно узнать кто именно, один или несколько — зная кто корпит можно узнать за какие именно поля он отвечает)
2) если за время работы пользователя над записью, кто-то ее по тихому поменял, то в моментнепосредственно внесенния изменений пользователь должен знать о том, что запись поменяли (желательно знать кто именно, один или несколько, но не обязательно)

У меня проблема следующего рода:
при одновременной работе нескольких экземпляров программ — они могут редактировать одну и туже запись даже не зная об этом — никаких ошибок при этом не возникает. — отсюда я сделал вывод что имеем дело с вариантом optimistic.
как я не пытался, так и не смог найти как же перейти в режим pessimistic ни в настройках сервака и базы, ни в свойствах компонент — нет ничего подобного (напомню, используется BDE, а не ADO). В ADO нашел свойство LockType у компонента TADOTable, выставил в pessimistic, но после открытия таблицы LockType сам переходит в состояние BatchOptimistic, на этом мое знакомство с ADO пока закончилось... Далее с BDE...
В BDE дошел до использования его внутренних функции:
DbiIsRecordLocked — при помощи этой функции можно проверить блокировку записи
DbiGetRecord — выставить записи WRITELOCK
DbiRelRecordLock — снять LOCK
DbiOpenLockList — открыть список всех блокировок
дык вот, перед тем как начать изменять запись пытаюсь проверить нет ли блокировки (DbiIsRecordLocked) — говорит нету, проверяю какие у нас имеются блокировочки(DbiOpenLockList) — никаких нема, ну нету и хорошо(смотрю в мониторе сервака-действительно нету), после того как вошел в режим записи опять проверяю нет ли блокировки (DbiIsRecordLocked) — говорит есть, проверяю какие у нас имеются блокировочки(DbiOpenLockList) — смотрю действительно есть одна, ну хорошо думаю, лезу в монитор сервака- как не было, так и нету блокировок((, ну и соответственно после Cancel и после Post проверяю блокировки и если есть снимаю...
вот такая грустная история...

Подытожим:
Стоит ли перейти с BDE на ADO, чем он лучше???
Как и где можно выставить Lock режим (pessimistic,optimistic)???
Как узнать редактирует кто-либо (и кто именно) сейчас запись или нет (что нужно доработать и как это лучше сделать)???
Как узнать была ли изменена запись с того момента как юзверь начал ее тиранить и если да, то кем (что нужно доработать и как это лучше сделать)???

Буду очень благодарен, если поможете...
ну а пока буду сам искать-ковырять
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.