![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избавиться от длительной блокировки записи?
guest_Dmitry © (2004-07-26 18:32:00)Столкнулся с такой проблемой: пользователь открыл запись в базе на редактирование и ушел покурить, кофе попить, либо внес изменения и забыл запостить датасет. В результате запись на длительное время остается заблокированная. Кто как с этим борется, подскажите пожалуйста.
guest_Dmitry (2004-07-26 19:18:00) [21]Так а что это изменит? Только то, что можно будет увидеть кто заблокировал запись?
Между
>Один оператор открыл форму для редактирования - данные по >данной записи ему передались "грязным чтением", но при этом в >таблицу блокировок добавилась соответствующая запись.
и
>Оператор внёс изменения в базу - блокировка убралась.
оператор может отвлечься на какое-то время, а блокировка то висит....
Ega23 (2004-07-26 19:11:00) [22]можно поподробнее применительно к Interbase?
C Interbase знаком плохо, поэтому пишу для MS SQL. Здесь идея важна, всё остальное вторично:
create table Blocks (
UNID int,
PersID int,
WorkCod int,
BlockNam varchar(16),
BlockID int)
PersID - ID оператора, ктоторый работает (если такие у тебя есть)
WorkCod - ID раб.станции, с которой работает оператор
BlockNam - Некое имя для операций, допустим "GOODS" - для товаров, "SHOPS" - для магазинов и т.п.
BlockID - собственно ID той записи, которую блокируешь.
Оператор перед началом редактирования проверяет таблицк блокировки. Если данная запись заблокирована кем-то другим - откат, если нет - вперёд.
Один оператор открыл форму для редактирования - данные по данной записи ему передались "грязным чтением", но при этом в таблицу блокировок добавилась соответствующая запись.
Оператор внёс изменения в базу - блокировка убралась.
Вот в таком вот духе.
guest_Dmitry (2004-07-26 18:55:00) [23]Ega23 © (26.07.04 18:51) [14]
т.е. каждый раз проверять существует ли запись вообще и в каком виде? до того, как пользователь нажмет "сохранить" запись может очень сильно измениться.....
по поводу:
>А ещё лучше - создаёшь таблицу блокировок, и блокируешь ЗАПИСЬ, >а не всю таблицу целиком
можно поподробнее применительно к Interbase?
Ega23 (2004-07-26 18:51:00) [24]записи то постятся по нажатии кнопки пользователем. т.е. вы предлагаете вместо dbedit-ов пользоваться простыми edit-ами, например, и по нажатии кнопки записывать все изменения в базу?
Лично я всегда именно так делаю. А проверить на существование идентичной записи ты можешь в момент "накатки" в базу. А ещё лучше - создаёшь таблицу блокировок, и блокируешь ЗАПИСЬ, а не всю таблицу целиком.
guest_Dmitry (2004-07-26 18:50:00) [25]ИдиотЪ (26.07.04 18:47) [11]
я TTable вообще не использую. поясни, пожалуйста, что имел в виду...
ИдиотЪ (2004-07-26 18:49:00) [26]guest_Dmitry
используй кешированный способ записи в базу
guest_Dmitry (2004-07-26 18:47:00) [27]ИдиотЪ (26.07.04 18:41) [6]
записи то постятся по нажатии кнопки пользователем. т.е. вы предлагаете вместо dbedit-ов пользоваться простыми edit-ами, например, и по нажатии кнопки записывать все изменения в базу?
Ega23 © (26.07.04 18:43) [7]
ИдиотЪ (26.07.04 18:45) [8]
использую fibDataSet
ИдиотЪ (2004-07-26 18:47:00) [28]а еще TTable сортировать в памяти бы научился,
ну нафига мне сервер мучить каждый раз?
ClientDataSet гораздо лучше себя ведет
Ega23 (2004-07-26 18:46:00) [29]взять родное и приспособленное что-нибудь
А я им и не пользуюсь, потому что он мне не нравиться
ИдиотЪ (2004-07-26 18:45:00) [30]Ega23 ©
забить на TTable
взять родное и приспособленное что-нибудь
Ega23 (2004-07-26 18:43:00) [31]Вот именно этим мне всегда TTable не нравился...
ИдиотЪ (2004-07-26 18:41:00) [32]а вообще вредно блокировки ставить надолго!
их ставят только для изменений в течении короткого времени, когда ты должен быть уверен в том, что изменяешь.
а просто открывать и потом редактировать или курить или еще чего - получишь соответственный результат
guest_Dmitry (2004-07-26 18:40:00) [33]Ega23 © (26.07.04 18:38) [4]
стоит ReadCommited
Ega23 (2004-07-26 18:38:00) [34]И не злоупотребляй высоким Isolation Level
guest_Dmitry (2004-07-26 18:36:00) [35]Игорь Шевченко © (26.07.04 18:34) [1]
СУБД Interbase 6.0
ИдиотЪ (26.07.04 18:35) [2]
от чего считать начинать?
ИдиотЪ (2004-07-26 18:35:00) [36]сделай тайм-аут, после чего сними блокировку
зависит от задачи, так как прочитать ее можно ведь
Игорь Шевченко (2004-07-26 18:34:00) [37]
> пользователь открыл запись в базе на редактирование
Это как ?
P.S. А база какая (СУБД) ?