В нашем приложении мы вставляем записи в 15 таблиц в транзакции из кода C #.Для этого мы создаем один оператор вставки для каждой таблицы, добавляем все в одном запросе и используем «ExecuteNonQuery» для вставки записей в таблицу.Поскольку мы хотим, чтобы вставка выполнялась во всех таблицах, и не хотим, чтобы какие-либо противоречивые данные использовались, мы используем их в транзакции.
Эта функциональность записана в службе, и более одного раза служба (одни и те же службы, различные установки) выполняет эту задачу (вставляя данные в таблицы) одновременно.Эти сервисы вставляют совершенно разные строки в таблицы и не зависят ни от чего.
Но когда мы запускаем эти сервисы, мы получаем взаимоблокировку этих операторов вставки.
Код выглядит следующим образом:
- Открыть соединение с БД
- Начать транзакцию
- Вставить данные в таблицы
- Подтвердить транзакцию.
Всеслужбы выполняют эти шаги для другого набора данных, находящихся в одних и тех же 15 таблицах.
Трассировка SQL Profiler предполагает наличие исключительных блокировок для этих таблиц при вставке.
Не могли бы вы подсказать, почему это должно происходитьблокировки на уровне таблицы при простом срабатывании оператора вставки в таблице и окончании в тупиках.И как лучше всего это предотвратить.