powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Синхронизация потоков http handler-a
7 сообщений из 7, страница 1 из 1
Синхронизация потоков http handler-a
    #40074452
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Есть http handler который хостится под IIS и обрабатывает запросы с клиентской части приложения. В клиенте где то дублируются запросы. Клиент шлет запросы асинхронно. В результате на сервере обработка происходит дважды и ложатся дубликаты в БД. Дебаг показывает что AppDomain и Process один и тот же, но запросы обрабатываются различными потоками. Блокировка через locker не помогает. В итоге на SQL сервере запросы так же работают параллельно в различных потоках и получается что оба select запроса проверки IsDataExists(...) проходят раньше чем первый insert в DoInsertData(...). Ошибка проявляется только после завершения рабочего процесса IIS. Т.е. когда был превышен Idle Timeout (в настройках пула приложения), а затем пришел запрос с клиента. Пока рабочий поток жив - все работает без ошибок (проверка IsDataExists(row) срабатывает).
Код: xml
1.
2.
AppDomainID: 2, ProcessID: 18092, ThreadID: 26
AppDomainID: 2, ProcessID: 18092, ThreadID: 22



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// класс обрабатывающий запросы 
public partial class ItemsDataController : BaseDataController
{
    private static readonly object locker = new object();

....

   protected override void DoSave(DataRow row)
   {
	lock (locker)
	{
            // Проверка что таких данных еще нет в БД (не добавлять дубликаты)
            if(IsDataExists(row))
               return;

            // Добавление записей в БД
            DoInsertData(row);
	
	 }
    }
.....
}



Подскажите пожалуйста каким образом можно заблокировать поток выполняющий DoSave(...) до момента завершения добавления записей в БД. Нужно что бы вызовы DoSave(...) отрботали последовательно. Тогда сработает проверка IsDataExists(...) и дубликат не будет добавлен.
...
Рейтинг: 0 / 0
Синхронизация потоков http handler-a
    #40074474
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может сразу на уровнеь базы перенесёте проверку и ставку в единую ХП, тогда и не надо будет ничего блокировать
...
Рейтинг: 0 / 0
Синхронизация потоков http handler-a
    #40074480
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первым взглядом все должно быть ОК. Если один процесс. У тебя там не веб-ферма? Если надо синк между несколькими процессами, то используй именованный мьютекс, например.
...
Рейтинг: 0 / 0
Синхронизация потоков http handler-a
    #40074483
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таких мест в приложении много. Это просто одно из них. Сам код работы с БД объемный и написан с использованием сторонних библиотек. Перенос в хранимки решил бы проблему конечно - но на данный момент это не возможно сделать из за очень большого объема переделок.
...
Рейтинг: 0 / 0
Синхронизация потоков http handler-a
    #40074487
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, у меня не веб ферма. Максимальное количество рабочих процессов выставлено 1. Если бы это были разные процессы - то возможно сработали бы мьютексы. Но дебаг показывает что процесс один. Разные потоки.
...
Рейтинг: 0 / 0
Синхронизация потоков http handler-a
    #40074542
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оберни эти 2 операции в транзакцию с уровнем изоляции "чтение закоммиченного"
или сделай одним вызовом хранимки

lock тут нафиг не нужен
...
Рейтинг: 0 / 0
Синхронизация потоков http handler-a
    #40074563
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_A_V_e
ложатся дубликаты в БД


Для начала, разместите уникальный индекс, чтобы исключить дубликаты.

Если вам нужна чётко последовательная запись в условиях конкурентных запросов, организуйте очередь в виде событий.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Синхронизация потоков http handler-a
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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