В настоящее время я работаю над сравнительным тестированием различных уровней изоляции в SQL Server 2008 - но сейчас я застрял в том, что кажется тривиальной проблемой взаимоблокировки, но, похоже, я не могу ее решить.Надеюсь, кто-то здесь может дать совет (я новичок в SQL)
В настоящее время у меня есть два типа транзакций (для демонстрации грязного чтения, но это не имеет значения):
Тип транзакции A: Выбратьвсе строки из таблицы A.
Тип транзакции B: Установите значение 'cost' = 0 во всех строках таблицы A, затем немедленно выполните откат.
В настоящее время я запускаю пул потоков из 1000 потоков и 10000транзакции, где каждый поток произвольно выбирает между выполнением типа транзакции A и типа транзакции B. Однако я получаю тонну взаимоблокировок даже при принудительной блокировке строки.
Я предполагаю, что взаимные блокировки возникают из-за строкиупорядочение получаемых блокировок, то есть, если и таблица типа А, и таблица «сканирования» типа А в одном и том же порядке, например сверху вниз, такие взаимные блокировки не могут возникнуть.Однако у меня возникают проблемы с выяснением того, как заставить SQL Server поддерживать порядок строк во время операторов SELECT и UPDATE.
Есть советы?Первый раз в стеке потока, поэтому, пожалуйста, будьте осторожны: -)
РЕДАКТИРОВАТЬ: уровень изоляции преднамеренно установлен на READ_COMMITTED, чтобы показать, что он устраняет грязные чтения (и это делает).Взаимные блокировки возникают только на любом уровне, равном или превышающем READ_COMMITTED;очевидно, что в READ_UNCOMMITTED не возникает взаимоблокировок.
РЕДАКТИРОВАТЬ 2: Эти транзакции выполняются на новом экземпляре AdventureWorks LT на SQL Server 2008R2.