|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть http handler который хостится под IIS и обрабатывает запросы с клиентской части приложения. В клиенте где то дублируются запросы. Клиент шлет запросы асинхронно. В результате на сервере обработка происходит дважды и ложатся дубликаты в БД. Дебаг показывает что AppDomain и Process один и тот же, но запросы обрабатываются различными потоками. Блокировка через locker не помогает. В итоге на SQL сервере запросы так же работают параллельно в различных потоках и получается что оба select запроса проверки IsDataExists(...) проходят раньше чем первый insert в DoInsertData(...). Ошибка проявляется только после завершения рабочего процесса IIS. Т.е. когда был превышен Idle Timeout (в настройках пула приложения), а затем пришел запрос с клиента. Пока рабочий поток жив - все работает без ошибок (проверка IsDataExists(row) срабатывает). Код: xml 1. 2.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Подскажите пожалуйста каким образом можно заблокировать поток выполняющий DoSave(...) до момента завершения добавления записей в БД. Нужно что бы вызовы DoSave(...) отрботали последовательно. Тогда сработает проверка IsDataExists(...) и дубликат не будет добавлен. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 17:04 |
|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
может сразу на уровнеь базы перенесёте проверку и ставку в единую ХП, тогда и не надо будет ничего блокировать ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 17:49 |
|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
Первым взглядом все должно быть ОК. Если один процесс. У тебя там не веб-ферма? Если надо синк между несколькими процессами, то используй именованный мьютекс, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:01 |
|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
Таких мест в приложении много. Это просто одно из них. Сам код работы с БД объемный и написан с использованием сторонних библиотек. Перенос в хранимки решил бы проблему конечно - но на данный момент это не возможно сделать из за очень большого объема переделок. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:06 |
|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
Нет, у меня не веб ферма. Максимальное количество рабочих процессов выставлено 1. Если бы это были разные процессы - то возможно сработали бы мьютексы. Но дебаг показывает что процесс один. Разные потоки. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:10 |
|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
оберни эти 2 операции в транзакцию с уровнем изоляции "чтение закоммиченного" или сделай одним вызовом хранимки lock тут нафиг не нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 21:43 |
|
Синхронизация потоков http handler-a
|
|||
---|---|---|---|
#18+
S_A_V_e ложатся дубликаты в БД Для начала, разместите уникальный индекс, чтобы исключить дубликаты. Если вам нужна чётко последовательная запись в условиях конкурентных запросов, организуйте очередь в виде событий. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2021, 00:34 |
|
|
start [/forum/topic.php?fid=18&msg=40074483&tid=1354525]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 139ms |
0 / 0 |