|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
Добрый день. Не могу найти, как реализовать хотя бы один из описанных ниже сценариев конкурентной работы... :( 1. Как сделать так, чтобы движок метод %Save() сохранял в БД не все свойства объектов, а только измененные в текущем сеансе? Чтобы не затирать старыми значениями конкурентные изменения других клиентов. 2. Как сделать так, чтобы движок Cache перед сохранением объекта проверял наличие конкурентных изменений в БД? Т. е. если запустить такой тест: Два клиента считали один и тот же объект x в виде x.p1 = "123" x.p2 = "qwe" Далее: сначала на клиенте 1 set x.p1 = "cli1" set x.p2 = "cli1" do x.%Save() затем на клиенте 2 set x.p2 = "cli2" x.%Save() В итоге в БД имеем x.p1 = "123" x.p2 = "cli2" А хотелось бы, чтобы для сценария 1 получилось x.p1 = "cli1" x.p2 = "cli2" а для сценария 2 второй клиент отвалился с ошибкой "запись конкурентно изменена". При этом проверки конкурентных изменений желательно делать только для измененных в текущей версии объекта полей, а не для всего объекта в целом. Лочить записи в данном случае нельзя, так как пользователи на каждом из клиентов могут очень долго думать (читай набивать длиннющий Description), прежде чем сохранят свои изменения. Приветствуются любые мысли по конкурентной работе в данном контексте (т. е. без локов). Больше всего интересуют мысли по поводу сценария 2. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2005, 23:18 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
а какое же будет удивление юзера, который долго набивал description а при сохранении ему вдруг стали отказывать, дескать до вас уже успели... стандартных средств вроде нет..но можна руками. тут смотря как у вас организована работа, но вобщем случае, думаю юзеру было бы полезно знать при открытии объекта тот факт, что объект уже открыт другим пользователем и что ему придется подождать, и например перейти в режим ReadOnly, можна даже опрашивать сервер с неким интервалом на доступность объекта и если он свободен, то переходить в режим корректирования ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 11:21 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
Лиман Артёма какое же будет удивление юзера, который долго набивал description а при сохранении ему вдруг стали отказывать, дескать до вас уже успели... У нас именно так. Все пользователи предупреждены и возражений от них нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 11:56 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
ну я Лиман Артёма какое же будет удивление юзера, который долго набивал description а при сохранении ему вдруг стали отказывать, дескать до вас уже успели... У нас именно так. Все пользователи предупреждены и возражений от них нет. ну ничего себе, бедный лузер вводит дохрина информации ни о чем не подозревая, а тут на тебе - все насмарку, мдя ... попробуйте открыть в студии класс и начать его корректировку, а потом по сети открыть тот же класс, что вам скажет каше? да, она скажет, что мол счас мона тока просмтаривать так как кто-то уже его корректирует..тут первый класс компилируем (ну типа изменения сохраняем) и второму клиенту сразу выводится предложение перезагрузить описание класса так как класс был изменен, вот так ИМХО более менее правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 12:01 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
Лиман Артёмну ничего себе, бедный лузер вводит дохрина информации ни о чем не подозревая, а тут на тебе - все насмарку, мдя ... Подозревает. Их обучают тому как ведет себя программа и как им вести себя в такой ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 12:12 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
У кого - как, а у наших пользователей лучше делать именно так. Причина в том, что они могут и на обед пойти, начать по телефону разговаривать, пойти на совещание, покурить, в туалет и вообще уйти с работы не выйдя из системы. Лучше раз в день одного посылать нафиг чем десяток каждый час. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 12:17 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
ну яУ кого - как, а у наших пользователей лучше делать именно так. Причина в том, что они могут и на обед пойти, начать по телефону разговаривать, пойти на совещание, покурить, в туалет и вообще уйти с работы не выйдя из системы. Лучше раз в день одного посылать нафиг чем десяток каждый час. ну для таких вещей есть таймаут простоя. Но если вам так подходит и все с этим согласны.... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 12:21 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
Лиман Артёмну для таких вещей есть таймаут простоя. Но если вам так подходит и все с этим согласны.... Есть и такое - но у нас это разные вещи. Если таймаут кончился, то при любом обращении к базе система просит подтвердить пароль. Типа а не цереушник ли ты, пробравшийся в здание и дождавшийся когда менеджер отлучится. После подтверждения работа продолжается с того же места. Если объект больше никем не редактировался, то даст сохранить нормально как ни в чем не бывало. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 13:43 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
Лиман Артём стандартных средств вроде нет..но можна руками. Я, честно говоря, не очень представляю, как это сделать руками... Для одного объекта - понятно. Можно считать две копии объекта, а перед сохранением - еще и третью и сравнить с той, что была считана изначально. Но как это сделать для всего графа связанных объектов? Я ведь не управляю загрузкой этих объектов... Может, можно перекрыть какие-то методы класса %Pesistent, чтобы реализовать необходимое мне поведение? Вообще-то я новичок в Каше и мне нужно понять, использовать его объектную модель или писать свою и работать на уровне Cache Direct. Пока только одна принципиальная проблема: не знаю как организовать конкурентный доступ в требуемом виде. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2005, 14:27 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
Не понял, как такое возможно - перписывание обновленного объекта. Куда версионность и блокировки смотрят ? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2005, 01:01 |
|
Конкурентная работа в Cache
|
|||
---|---|---|---|
#18+
originator Лиман Артём стандартных средств вроде нет..но можна руками. Я, честно говоря, не очень представляю, как это сделать руками... Для одного объекта - понятно. Можно считать две копии объекта, а перед сохранением - еще и третью и сравнить с той, что была считана изначально. Но как это сделать для всего графа связанных объектов? Я ведь не управляю загрузкой этих объектов... Может, можно перекрыть какие-то методы класса %Pesistent, чтобы реализовать необходимое мне поведение? Вообще-то я новичок в Каше и мне нужно понять, использовать его объектную модель или писать свою и работать на уровне Cache Direct. Пока только одна принципиальная проблема: не знаю как организовать конкурентный доступ в требуемом виде. Объекты можно открывать с разным уровнем concurrency (http://platinum.intersystems.com/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_concurrency). Высылаю небольшую презентацию про блокировки, транзакции и concurrency. Что касается Вашего вопроса, то советую Вам обсудить его с консультантами InterSystems. Есть много нюансов. Можно управлять, какие связанные объекты будут подгружаться, какие сохраняться и т.д. Если захотите писать "свои объекты", обязательно пообщайтесь с InterSystems. Часто оказывается, то есть простые подходы решения самых разных задач. Так что, позвоните или напишите консультантам в InterSystems. Вадим ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2005, 12:56 |
|
|
start [/forum/topic.php?fid=39&msg=32896612&tid=1559757]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 153ms |
0 / 0 |