Я почти уверен, что вы правильно понимаете ситуацию.
Как вы, очевидно, знаете, при выполнении транзакции SQL любое обновление, которое может повлиять на обновляемые вами таблицы, должно быть предотвращено.Подумайте о принципах ACID (http://en.wikipedia.org/wiki/ACID).
Я думаю, что единственный способ обойти это - использовать READ UNCOMMITTED
или NOLOCK
Реализация грязного чтения или блокировки уровня 0, что означаетчто общие блокировки не выдаются и исключительные блокировки не учитываются. Когда установлена эта опция, можно читать незафиксированные или грязные данные, значения в данных могут быть изменены, а строки могут появляться или исчезать в наборе данных до концатранзакция. Этот параметр имеет тот же эффект, что и установка NOLOCK
для всех таблиц во всех операторах SELECT
в транзакции. Это наименее ограничивающий из четырех уровней изоляции.
Вы можете работатьрискнуть этим для себя.
Я на самом деле думаю, что ответ заключается в том, чтобы сделать транзакцию как можно более короткой и мириться с ней, поскольку она делает это только для защиты целостности данных, например, только запускает и заканчиваеттранзакция вокруг фактических операций обновления.
Надеюсь, это немного поможет.