Как обеспечить "единственность" обработки записи?
Добавлено: 17 авг 2006, 16:04
FB 1.5.3.
С одной базой работают две программы - серверная, обеспечивающая общее управление базой и подключаемыми клиентами, и n экземпляров клиенской, предназначенной для просмотра/редактирования записей. Для серверной предполагается возможность отключения режима интерактивности, и все MessageBox и т.д., которые могут на ней вызываться, должны быть показаны только на первом поймавшем Event клиенте. Я попытался сделать так:
создал таблицу AppMessages(ID INT NOT NULL, MsgCaption VARCHAR(50), MsgText VARCHAR(250), MsgButtons INT, MsgResult INT), серверная программы записывает в эту таблицу сообщение, проставляя MsgResult в -1, затем вызывает нужный POST_EVENT, зарегестрированный на клиентах. Расчет делается на то, что первый поймавший Event клиент отредактирует запись, установив MsgResult в -2 в качестве блокировки, дабы остальные, увидев -2, не трогали его, а потом покажет окно диалога, и по его завершении пропишет в MsgResult нажатую кнопку, вызвав затем Event для сервера, чтобы тот считал результат.
Проблема в том, что я плохо представляю себе механизм блокировки записей и событий, и мне представляется, что остальные клиенты могут также успеть прочесть запись до того момента, как она будет заблокирована через поле MsgResult.
Как можно обеспечить эту схему, чтобы гарантированно не дать работать с записью после получения Event более чем одному клиенту?
С одной базой работают две программы - серверная, обеспечивающая общее управление базой и подключаемыми клиентами, и n экземпляров клиенской, предназначенной для просмотра/редактирования записей. Для серверной предполагается возможность отключения режима интерактивности, и все MessageBox и т.д., которые могут на ней вызываться, должны быть показаны только на первом поймавшем Event клиенте. Я попытался сделать так:
создал таблицу AppMessages(ID INT NOT NULL, MsgCaption VARCHAR(50), MsgText VARCHAR(250), MsgButtons INT, MsgResult INT), серверная программы записывает в эту таблицу сообщение, проставляя MsgResult в -1, затем вызывает нужный POST_EVENT, зарегестрированный на клиентах. Расчет делается на то, что первый поймавший Event клиент отредактирует запись, установив MsgResult в -2 в качестве блокировки, дабы остальные, увидев -2, не трогали его, а потом покажет окно диалога, и по его завершении пропишет в MsgResult нажатую кнопку, вызвав затем Event для сервера, чтобы тот считал результат.
Проблема в том, что я плохо представляю себе механизм блокировки записей и событий, и мне представляется, что остальные клиенты могут также успеть прочесть запись до того момента, как она будет заблокирована через поле MsgResult.
Как можно обеспечить эту схему, чтобы гарантированно не дать работать с записью после получения Event более чем одному клиенту?