|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Господа, следующая ситуация: есть следующая комбинация атрибутов: сделка, объект сделки (что покупаем/продаем), папка сделки (место, где лежит конкретная сделка). Над ними выполняется так называемая бизнес-операция (по сути - набор проводок). Необходимо обеспечить, чтобы в один момент времени только один человек мог выполнить конкретную бизнес-операцию по набору вышеперечисленных параметров. Я решил сделать это с использованием пользовательских блокировок (в Oracle такая штука есть - делаешь блокировку с каким-нибудь номером и при попытке создать блокировку с таким-же номером получаешь отлуп). Соответственно нужно формировать этот номер. Я подумал, что можно получать его как сумму ID всех атрибутов (это на самом деле либо PK, либо FK), но он получается ну очень большим (так как бизнес-операции осуществляются по достаточно большому количеству сделок, папок), а код блокировки в Oracle - number. Следовательно размерности не хватает. Какие могут быть другие варианты формирования кода? Кто как решает аналогичные проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 12:53 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Shtock пишет: > папок), а код блокировки в Oracle - number. Следовательно размерности не > хватает. Какие могут быть другие варианты формирования кода? Кто как > решает аналогичные проблемы? Использую собственный механизм блокировок с нужным набором параметров любого типа. Реализуется достаточно просто - 1 таблица блокировок и 2 процедуры - попытка повесить блокировку и снятие блокировки. Posted via ActualForum NNTP Server 1.3 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 13:06 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Как-то фигачить свое неохота. Нужно отдельную табличку делать. Что-то в нее писать. А если сессии отвалятся... Нужен сборщик мусора. Но все-таки было бы интересно узнать как Ваш механизм устроен. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 13:10 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Так и устроено - в табличку пишется тип и код блокируемого обьекта, дата блокировки, код сессии и пользователь. Перед попыткой изменения записи вызывается ХП, которая ругается, если блокировка другой сессии есть и вешает свою, если блокироки еще нет. Для 100% гарантии вешается ее же вызов на триггера изменения и удаления, только с указанием флага, не проводить блокировку, а только проверить, не блокирована ли запись другой сессией. Так же, после успешного завершения сохранения, клиентской частью вызывается та же ХП, удаляющая блокировку (в идеале делает предок изменения записей, где вначале при открытии идет попытка блокировать обьект, а после удачного сохранения - снятие блокировки и потом все окна изменения наследуются от него). Так же в БД написанно событие EVENT ON DISCONNECT, которое автопилотом вызывается СУБД на отвалившуюся или отсоединившуюся сессию и код внутри нее чистит по коду сессии висящие блокировки из таблицы блокировок. Таким образом гарантируется отсутствие мусора в таблице блокировок и наличие механизма их снятия - администратору достаточно убить сессию, которая повесила на долгое время блокировку на изменение документа (хочу заметить именно документа, что может быть по понятиям гораздо обширнее, чем одна таблица и одна запись) или же если у сервера выставлен timeout idle, он сам убьет бездействующую сессию, таким образом инициализировав чистку блокировок по ней. Думаю, в Оракле есть аналогичный механизм EVENT-ов (или еще чего, может просто по другому называется), который позволяет на различные события сервера вызывать свой код, в т.ч. и на CONNECT/DISCONNECT сессий. Пользоваться же блокировками сервера в своих личных корыстных целях думается не есть хорошо, ресурснозатратно и не известно к чему плохому может привести. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 15:35 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Идея в принципе понятна, но так лениво писать... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 16:02 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Shtock пишет: > Идея в принципе понятна, но так лениво писать... Так в чем проблема? Тут, я полагаю, найдется много людей, которые напишут это за вас. Не безвозмездно, конечно же Posted via ActualForum NNTP Server 1.3 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 17:28 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Позволю себе немного выпендриться, на моей работе и так напишут за меня. Мне главное написать как. Я, правда, если не поборю лень, уже придумал наинаглейшую фразу в ТЗ: "Разработка механизма блокировки по выбору отдела разработки" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 17:41 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
ShtockПозволю себе немного выпендриться, на моей работе и так напишут за меня. Мне главное написать как. Я, правда, если не поборю лень, уже придумал наинаглейшую фразу в ТЗ: "Разработка механизма блокировки по выбору отдела разработки" :)Интересно... Всегда считал, что выбор способа реализации - это прерогатива разработчика ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2005, 19:00 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
ShtockА чем select for update nowait не устраивает? Только нужно понять, куда его лучше прилепячить. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2005, 01:07 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
авторВсегда считал, что выбор способа реализации - это прерогатива разработчика Отнюдь. При выборе способа реализации следует учитывать много факторов. Знание некоторых из них не является обязанностью отдельного разработчика и даже может быть вне его компетенции. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2005, 09:10 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
To Vadim_Maximov Потому, что цель - позволить выполнить определенную бизнес-операцию по определенной комбинации параметров. Если же мы будем делать select for update - заблокируем монопольно выполнение ВСЕХ бизнес-операций по комбинации параметров. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2005, 09:36 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Попробую чуть более подробно объяснить. Может действительно select for update спасет, а я этого не вижу. Есть таблица сделок. Сделки в отношении 1-1 входят в папки. Сделки заключаются с определенным объектом: тоже ссылка 1-1. ПОльзователь выбирает объекты сделок, входящие в конкретные папки и сама система уже определяет сделки с этими объектами. Если мы заблокируем таблицу сделок, потом объектов сделок, папок и бизнес-операций 1. Если другой пользователь захочет выполнить другую бизнес-операцию по такому же набору сделок, объектов сделок и папок - то произойдет отлуп - заблокированы таблицы набора. 2. Если же другой пользователь захочет выполнить такую же бизнес-операцию, но по другому набору - тоже отлуп - ведь и таблица бизнес-операций заблокирована. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2005, 09:45 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Зачем блокировать полностью таблицу? Только нужные записи. Но тогда проблема в другом: select for update объекта и его детальных записей не спасает от добавления записей в детальные таблицы для объекта, что в прикладном смысле также является изменением объекта. Это нужно ловить уже своими триггерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2005, 15:05 |
|
Блокировка уровня задачи
|
|||
---|---|---|---|
#18+
Я говорю обобщенно. SELECT FOR UPDATE как раз и блокирует записи. При выполнении бизнес-операции изменения параметров сделки уже не может быть (у нее установлен соответствующий статус - типа готова для проводок). Это не проблема. Проблема четко обозначена в предыдущем посте. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2005, 15:53 |
|
|
start [/forum/search_topic.php?author=anonim_Cerebro&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 490ms |
total: | 783ms |
0 / 0 |