SQL Server 2008: получение взаимоблокировок… без каких-либо блокировок

В настоящее время я провожу несколько экспериментов с базой данных SQL Server 2008. В частности, у меня есть приложение JDBC, которое использует сотни параллельных потоков для выполнения тысяч задач, каждая из которых выполняет следующий запрос к базе данных:

UPDATE from Table A where rowID='123'

Однако я получаю массу тупиковых ошибок (исключение SQL 1205). всякий раз, когда я устанавливаю уровень изоляции выше READ_UNCOMMITTED. Это происходит, даже если я устанавливаю блокировку строк, блокировку таблицы и подсказки эксклюзивной блокировки! И даже в режиме Snapshot Isolation, который не использует блокировки, я все равно получаю тупиковые ошибки.

Я запустил трассировку через SQL Profiler, чтобы получить график тупиковых ситуаций, когда это происходит, но от этого мало толку. Он показал процесс-жертву, подключенный к «пулу потоков», связанный с сотнями других процессов. Вы можете проверить это здесь:

http://i.stack.imgur.com/7rlv3.jpg

У кого-нибудь есть какие-нибудь подсказки относительно того, почему это происходит? Я схожу с ума последние несколько дней, пытаясь понять это. Моя текущая гипотеза состоит в том, что это связано либо с доступными рабочими потоками в моем экземпляре БД, объемом доступной памяти, либо с чем-то, что не связано с фактическими блокировками на уровне запроса.

Спасибо!

6
задан marc_s 28 March 2011 в 21:16
поделиться