У меня в приложении ASP.NET этот процесс:
- Начать соединение
- Начать транзакцию
- Вставьте в таблицу «LoadData» множество значений с помощью класса SqlBulkCopy со столбцом, содержащим определенный LoadId.
- Вызовите хранимую процедуру, которая:
- читать таблицу «LoadData» для конкретного LoadId.
- Для каждой строки выполняется много вычислений, что подразумевает чтение десятков таблиц и запись результатов во временную (#temp) таблицу (процесс, который длится несколько минут).
- Удаляет строки в «LoadDate» для определенного LoadId.
- Как только все будет сделано, запишите результат в таблицу результатов.
- Фиксация транзакции или откат в случае сбоя.
Моя проблема в том, что если у меня есть 2 пользователя, которые запускают процесс, второму придется подождать, пока предыдущий закончил (потому что вставка, кажется, устанавливает исключительную блокировку на таблицу), и мое приложение иногда падает в таймаут (и пользователи не рады ждать :)).
Я ищу способ иметь пользователей, которые делают все параллельно, поскольку нет взаимодействия, кроме последнего: записи результата. Я думаю, что меня блокирует вставка / удаление в таблицу «LoadData».
Я проверил другие уровни изоляции транзакций, но, похоже, ничто не могло мне помочь.
Что было бы идеально, если бы была возможность удалить монопольную блокировку для таблицы «LoadData» (можно ли заставить SqlServer блокировать только строки, а не таблицу?), Когда вставка завершена, но без завершения транзакции .
Есть предложения?