
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
20.02.2015, 18:44
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
FB 2.5 Добрый вечер! Цель: Сервис запрос-ответ. При обращении клиента (ПО) выбираю по определенному статусу запись из таблицы, провожу над ней определенные манипуляции и возвращаю результат. Проблема: как сделать, что бы в конкурентной среде другая транзакция не получила доступа к этой же записи? При этом не просто получила ошибку (как если бы я выбирал for update with lock), а не "видела" ее? Т.е. другими словами, каждой транзакции своя запись? Подскажите плиз, как грамотно решить задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 18:57
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
H.e.l.pПодскажите плиз, как грамотно решить задачу? Ответ такой же как и у соседа по парте: никак, обломись. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 19:04
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Dimitry SibiryakovОтвет такой же как и у соседа по парте: никак, обломись. Т.е. кроме как обрабатывать ошибку на клиенте и стучаться еще раз вариантов нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 19:27
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
H.e.l.pТ.е. кроме как обрабатывать ошибку на клиенте и стучаться еще раз вариантов нет? Есть: использовать для организации очередей специально для этого предназначенные продукты и не грузить птицу несвойственной для хранилища данных работой. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 20:39
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 20:45
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
вариант костыля: в хранимой процедуре взводится некий генератор gen_id(gen_xxx,1); пока он взведен gen_id(gen_xxx,0)=1 все остальные транзакции сразу выходят из этой процедуры, но ошибки не возникает транзакция-захватчик в это время помечает отобранные для обработки записи обычным update и отпускает генератор gen_id(gen_xxx,-1); после этого спокойно возвращает отобранный датасет с т.з. программы запрос либо возвращает 0 записей, либо некий набор, над которым можно производить действия если генератор зависнет во взведенном положении, то встанут все участники лотереи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 21:13
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
krapotkinвариант костыля: А где гарантия что 2 транзакции не получат одновременно при проверке 0, и каждый увеличит генератор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 21:32
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
механизм генераторов так сделан ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 21:34
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
иначе была бы логичной возможность одновременно получать одинаковые значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 21:56
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
krapotkin> если генератор зависнет во взведенном положении, то встанут все участники лотереи Это ещё меньшая беда, побочный эффект. А основной эффект - что это нифига не конкурентная среда и обработка, которую просит автор. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 22:00
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
krapotkinи отпускает генератор gen_id(gen_xxx,-1); после этого спокойно возвращает отобранный датасет Следующая транзакция проверяет взведенность генератора, и получает gen_id(gen_xxx,0) = 0 И до момента того как эта транзакция увеличит генератор, другая тоже может "поймать" = 0 krapotkinмеханизм генераторов так сделан Механизм сделан таким чтобы гарантированно получить новое уникальное значение, а не устраивать "гонки" кто первый поставит значение = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 22:30
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Генераторы не трогай, они транзакционно независимы. Я бы попробовал сделать так: 1. создал таблицу очередей Т2 с уникальным ключом - ид записи из нужной тебе таблицы, допустим Т1 2. выборка из Т1 записи, не содержащей ссылки на Т2 3. добавление ссылки в Т2 на Т1, если нарушение уникальности - значит запись залочена кем-то другим, идем дальше 4. если все норм - делаем нужные манипуляции и удаляем ссылку на Т1 из Т2 ХЗ по факту что получится, пятница все же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 22:34
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Для такой схемы вторая таблица не нужна, достаточно визлочить первую. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.02.2015, 23:59
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
а если уточнить условие? стартует только та, у которой gen_id(xxx,1) =1 остальные делают "отмену": gen_id(xxx,-1) ; опять конечно могут быть проблемы оборванных транзакций, но и тут можно что-нибудь придумать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.02.2015, 08:45
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Я бы подошел вообще с другой стороны. Один (значет нет проблемы дэдлоков и конфликтов) демон диспетчер крутится в фоне и заведует очередями (по некому алгоритму расставляет ИДы подписчиков на события), подписчики разбирают события только со своими ИДами. Алгорим может быть простым, может быть витиеватым, может смотреть у кого застряла очередь и перекидывать события другим подписчикам и т.п. на сколько хватит фантазии в ТЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.02.2015, 11:58
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
ну, т.е. трехзвенка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.02.2015, 11:50
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
krapotkinну, т.е. трехзвенка...Где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.02.2015, 14:32
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Ivan_Pisarevsky> Я бы подошел вообще с другой стороны. Если без трехзвенки, то хрен редьки не слаще, хоть выделяй его в отдельный модуль/процесс/что угодно, хоть не выделяй - ничего принципиально не меняется, то же самое. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.02.2015, 17:14
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Гаджимурадов РустамЕсли без трехзвенки, то хрен редьки не слащеВы меня пугаете... в "несладость" заключается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.02.2015, 18:09
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Ivan_Pisarevsky> в "несладость" заключается? "В несладость" заключается в том же, что и сладость. Хоть выделяй её в отдельный диспетчер/демон/модуль или ещё какой-нибудь хрен собачий, хоть не выделяй. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.02.2015, 21:08
|
|||
|---|---|---|---|
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
Гаджимурадов Рустам Диму не слушай, решения есть, их больше одного и они описывались.. Если были решения - дай, плиз, ссылку. По поводу проблемных ситуаций - откатить изменения. У меня сервис на PHP, транзакция короткоживущая, запускает ХП. В случае успешного завершения делает commit, ошибочного rollback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.02.2015, 02:25
|
|||
|---|---|---|---|
|
|||
Хитрая блокировка записи в конкурирующей среде |
|||
|
#18+
H.e.l.p> Если были решения - дай, плиз, ссылку. Это искать надо, поищи. Начни с бездырочной нумерации, no_req_version + no_wait, with lock и т.д. Если с чем-то конкретно не разберёшься - спрашивай, подскажут, тут народ не жадный. > транзакция короткоживущая, запускает ХП. Ну так тем более начинай с no_wait + no_req_version. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=40&mobile=1&tid=1563008]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
165ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 266ms |
| total: | 525ms |

| 0 / 0 |
