Ваша проблема - уровень изоляции, который вы используете. Если вы не измените его, SQL Server (и многие другие базы данных) будут работать в режиме, который выбирает, будет блокировать незафиксированные чтения. Вы хотите изменить SQL Server таким образом, чтобы он вместо этого использовал MVCC (по умолчанию для Oracle; MySQL и SQL Server также имеют его), и ваша проблема исчезнет.
С УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СДЕЛКИ (Transact-SQL) :
ЧИТАЙТЕ КОМИТЕТ
Указывает, что операторы не могут читать
данные, которые были изменены, но не
совершенные другими транзакциями. это
предотвращает грязное чтение. Данные могут быть
изменено другими транзакциями между
отдельные заявления в рамках
текущая транзакция, в результате чего
неповторимые чтения или фантомные данные.
Этот параметр используется по умолчанию для SQL Server.
Поведение READ COMMITTED зависит
на настройке
READ_COMMITTED_SNAPSHOT база данных
Опция:
- Если для READ_COMMITTED_SNAPSHOT установлено значение OFF (по умолчанию), компонент Database Engine
использует общие блокировки для предотвращения других
транзакции от изменения строк в то время как
текущая транзакция выполняется
операция чтения. Общие блокировки также
заблокировать оператор от чтения строк
изменено другими транзакциями до
другая транзакция завершена.
Тип общей блокировки определяет, когда
это будет выпущено. Рядные замки
выпущен до следующего ряда
обработанный. Блокировки страниц снимаются
когда следующая страница прочитана, и таблица
блокировки снимаются при утверждении
отделка.
- Если для READ_COMMITTED_SNAPSHOT установлено значение ON, компонент Database Engine использует строку
управление версиями для представления каждого утверждения
с транзакционной последовательностью
снимок данных в том виде, в каком они существовали на
начало заявления. Замки
не используется для защиты данных от
обновления другими транзакциями.
Когда READ_COMMITTED_SNAPSHOT
опция базы данных включена, вы можете использовать
READCOMMITTEDLOCK табличная подсказка для
запросить общую блокировку вместо строки
управление версиями для отдельных утверждений
в транзакциях, запущенных на READ
СОВЕРШЕННЫЙ уровень изоляции.
(выделение добавлено)
Измените конфигурацию базы данных, чтобы включить READ_COMMITTED_SNAPSHOT в значение ON.
Кроме того, постарайтесь сделать ваши транзакции как можно более короткими и убедитесь, что вы фиксируете транзакцию в фоновом процессе (который выполняет 10 000 операций вставки в час), потому что если он никогда не будет зафиксирован, то выбор будет блокироваться навсегда (по умолчанию настройки).