powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хитрая блокировка записи в конкурирующей среде
22 сообщений из 22, страница 1 из 1
Хитрая блокировка записи в конкурирующей среде
    #38885346
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB 2.5

Добрый вечер!

Цель: Сервис запрос-ответ. При обращении клиента (ПО) выбираю по определенному статусу запись из таблицы, провожу над ней определенные манипуляции и возвращаю результат.

Проблема: как сделать, что бы в конкурентной среде другая транзакция не получила доступа к этой же записи? При этом не просто получила ошибку (как если бы я выбирал for update with lock), а не "видела" ее? Т.е. другими словами, каждой транзакции своя запись?

Подскажите плиз, как грамотно решить задачу?
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885363
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.pПодскажите плиз, как грамотно решить задачу?
Ответ такой же как и у соседа по парте: никак, обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885372
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОтвет такой же как и у соседа по парте: никак, обломись.


Т.е. кроме как обрабатывать ошибку на клиенте и стучаться еще раз вариантов нет?
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885387
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.pТ.е. кроме как обрабатывать ошибку на клиенте и стучаться еще раз вариантов
нет?
Есть: использовать для организации очередей специально для этого предназначенные продукты
и не грузить птицу несвойственной для хранилища данных работой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885430
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.p> Проблема: как сделать, что бы в конкурентной среде другая транзакция
H.e.l.p> не получила доступа к этой же записи? При этом не просто получила
H.e.l.p> ошибку (как если бы я выбирал for update with lock), а не "видела" ее?
H.e.l.p> Т.е. другими словами, каждой транзакции своя запись?

Диму не слушай, решения есть, их больше одного и они описывались..

Но настоящая проблема тут в другом и она предметная - что нужно
будет делать в определённых "проблемных" ситуациях - например,
когда "определенные манипуляции" над "своей записью" обломились
или были отменены, или просто потеря коннекта. И т.д.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885434
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант костыля:

в хранимой процедуре взводится некий генератор gen_id(gen_xxx,1);
пока он взведен gen_id(gen_xxx,0)=1
все остальные транзакции сразу выходят из этой процедуры, но ошибки не возникает
транзакция-захватчик в это время помечает отобранные для обработки записи обычным update
и отпускает генератор gen_id(gen_xxx,-1);
после этого спокойно возвращает отобранный датасет

с т.з. программы запрос либо возвращает 0 записей, либо некий набор, над которым можно производить действия
если генератор зависнет во взведенном положении, то встанут все участники лотереи
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885451
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinвариант костыля:
А где гарантия что 2 транзакции не получат одновременно при проверке 0, и каждый увеличит генератор?
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885457
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
механизм генераторов так сделан
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885459
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
иначе была бы логичной возможность одновременно получать одинаковые значения
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885469
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin> если генератор зависнет во взведенном положении, то встанут все участники лотереи

Это ещё меньшая беда, побочный эффект.
А основной эффект - что это нифига не
конкурентная среда и обработка, которую
просит автор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885470
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinи отпускает генератор gen_id(gen_xxx,-1);
после этого спокойно возвращает отобранный датасет
Следующая транзакция проверяет взведенность генератора, и получает
gen_id(gen_xxx,0) = 0
И до момента того как эта транзакция увеличит генератор, другая тоже может "поймать" = 0

krapotkinмеханизм генераторов так сделан

Механизм сделан таким чтобы гарантированно получить новое уникальное значение, а не устраивать "гонки" кто первый поставит значение = 1
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885479
Генераторы не трогай, они транзакционно независимы. Я бы попробовал сделать так:
1. создал таблицу очередей Т2 с уникальным ключом - ид записи из нужной тебе таблицы, допустим Т1
2. выборка из Т1 записи, не содержащей ссылки на Т2
3. добавление ссылки в Т2 на Т1, если нарушение уникальности - значит запись залочена кем-то другим, идем дальше
4. если все норм - делаем нужные манипуляции и удаляем ссылку на Т1 из Т2
ХЗ по факту что получится, пятница все же...
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885480
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для такой схемы вторая таблица не
нужна, достаточно визлочить первую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885490
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если уточнить условие?
стартует только та, у которой gen_id(xxx,1) =1
остальные делают "отмену": gen_id(xxx,-1) ;

опять конечно могут быть проблемы оборванных транзакций, но и тут можно что-нибудь придумать
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885557
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы подошел вообще с другой стороны.
Один (значет нет проблемы дэдлоков и конфликтов) демон диспетчер крутится в фоне и заведует очередями (по некому алгоритму расставляет ИДы подписчиков на события), подписчики разбирают события только со своими ИДами.

Алгорим может быть простым, может быть витиеватым, может смотреть у кого застряла очередь и перекидывать события другим подписчикам и т.п. на сколько хватит фантазии в ТЗ.
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885584
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, т.е. трехзвенка...
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885894
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinну, т.е. трехзвенка...Где?
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38885944
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky> Я бы подошел вообще с другой стороны.

Если без трехзвенки, то хрен редьки не слаще, хоть выделяй
его в отдельный модуль/процесс/что угодно, хоть не выделяй -
ничего принципиально не меняется, то же самое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38886041
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЕсли без трехзвенки, то хрен редьки не слащеВы меня пугаете... в "несладость" заключается?
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38886054
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky> в "несладость" заключается?

"В несладость" заключается в том же, что и сладость.
Хоть выделяй её в отдельный диспетчер/демон/модуль
или ещё какой-нибудь хрен собачий, хоть не выделяй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38886106
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Диму не слушай, решения есть, их больше одного и они описывались..



Если были решения - дай, плиз, ссылку.

По поводу проблемных ситуаций - откатить изменения. У меня сервис на PHP, транзакция короткоживущая, запускает ХП. В случае успешного завершения делает commit, ошибочного rollback.
...
Рейтинг: 0 / 0
Хитрая блокировка записи в конкурирующей среде
    #38886198
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.p> Если были решения - дай, плиз, ссылку.

Это искать надо, поищи. Начни с бездырочной
нумерации, no_req_version + no_wait, with lock и т.д.
Если с чем-то конкретно не разберёшься -
спрашивай, подскажут, тут народ не жадный.

> транзакция короткоживущая, запускает ХП.

Ну так тем более начинай с no_wait + no_req_version.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хитрая блокировка записи в конкурирующей среде
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]