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

start [/forum/topic.php?fid=40&msg=38885457&tid=1563008]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 285ms |
| total: | 540ms |

| 0 / 0 |
