|
блокировказаписи при редактировании, Net Remoting
|
|||
---|---|---|---|
#18+
Есть таблица в Оракле Id Name BlockedBy 1 Name1 null 2 Name2 null 3 Name3 null Есть клиентское приложение (C#) и сервер приложений Net Remoting Необходимо сделать блокировку записи с Id = 1 для других пользователей при редактировании Сервер приложений подключается к б.д. делает select * from Table1 where Id = 1 and BlockedBy is null for update далее если строка не заблокирована update Table1 set BlockedBy = User_Id where Id = 1 если заблокирована выдает сообщение об этом данные селекта отправляются на клиента, связь с б.д. в сервере приложений закрывается Пользователь меняет данные и отправляет изменения на сервер Сервер приложений подключается к б.д. делает update Table1 set Name1 = NewName, BlockedBy = null where Id = 1 Всё это хорошо работает, пока не произошло каких-либо сбоев на клиенте, после сбоя поле BlockedBy остается заполненым. Вопрос как сделать блокировку записи при редактировании, чтобы она работала и в случае сбоев? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2007, 22:56 |
|
блокировказаписи при редактировании, Net Remoting
|
|||
---|---|---|---|
#18+
Неужели никто не делал? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2007, 21:18 |
|
блокировказаписи при редактировании, Net Remoting
|
|||
---|---|---|---|
#18+
ты можешь сделать следующее... подвать операции на сервер приложений пачками. смотри тебе нужно просто знать принял ли клиент данные. т.е. клиент в ответ на данные СП должен послылать что то в виде "ок". если в должное время "ок" от клиента не пришел, значит клиент обвалился. далее делаем либо откат операции, либо что другое. http://webusblog.blogspot.com/ ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2008, 15:23 |
|
блокировказаписи при редактировании, Net Remoting
|
|||
---|---|---|---|
#18+
А информация, за кем заблокирована запись, критична? Если нет - выкидывайте поле BlockedBy, select ... for update сам накладывает на выбранные строки RX-блокировку. Факт наличия блокировки из других сессий определяется попыткой все тем же select ... for update nowait (да, здесь нужна опция nowait) - при наличии блокировки на запрашиваемый ресурс вылетит ORA-00054: resource busy and acquire with NOWAIT specified. Поле при сбое остается заполненным из-за того, что сервер фиксирует транзакцию, в ходе которой выполняется update Table1 set BlockedBy = User_Id where Id = 1 - могу посоветовать ловить в нужных местах exceptions на клиенте, и при их наличии снимать флаг блокировки. Но это не самый лучший выход, т.к. блокировать ресурс на время действий пользователя, и снимать блокировку по user events в большинстве случаев просто неприемлемо - представьте себе, что пользователь залочил запись, а потом пошел обедать. Или ушел домой, а наутро уехал в командировку, не разлочив запись. Что будут делать те, кому эта запись нужна? Обычно наложение блокировки, DML, и снятие блокировки по commit/rollback проходят в контексте одной транзакции. P.S. Если все же интересно, кто удерживает запись - можно обратиться к DBA_DML_LOCKS. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2008, 15:52 |
|
блокировказаписи при редактировании, Net Remoting
|
|||
---|---|---|---|
#18+
Дык, он после селекта отключается. Какая там блокировка. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2008, 20:01 |
|
блокировказаписи при редактировании, Net Remoting
|
|||
---|---|---|---|
#18+
Сахават ЮсифовДык, он после селекта отключается. Какая там блокировка. Да я все это приекрасно понимаю, поэтому и говорю, что блокировать записи и производить изменения надо в контексте одной транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2008, 06:00 |
|
|
start [/forum/topic.php?fid=19&fpage=35&tid=1398019]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 229ms |
total: | 349ms |
0 / 0 |