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

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

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

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

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


Т.е. кроме как обрабатывать ошибку на клиенте и стучаться еще раз вариантов нет?
...
Рейтинг: 0 / 0
20.02.2015, 19:27
    #38885387
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая блокировка записи в конкурирующей среде
H.e.l.pТ.е. кроме как обрабатывать ошибку на клиенте и стучаться еще раз вариантов
нет?
Есть: использовать для организации очередей специально для этого предназначенные продукты
и не грузить птицу несвойственной для хранилища данных работой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.02.2015, 20:39
    #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
20.02.2015, 20:45
    #38885434
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая блокировка записи в конкурирующей среде
вариант костыля:

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

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

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

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

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

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

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

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

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



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

По поводу проблемных ситуаций - откатить изменения. У меня сервис на PHP, транзакция короткоживущая, запускает ХП. В случае успешного завершения делает commit, ошибочного rollback.
...
Рейтинг: 0 / 0
23.02.2015, 02:25
    #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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хитрая блокировка записи в конкурирующей среде / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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