SQL nolock и присоединиться - PullRequest
0 голосов
/ 02 сентября 2011

Я использую процесс, который непрерывно вставляет данные в 2 таблицы с блокировкой строки.В то же время я хочу использовать несколько запросов к этим таблицам.Как я уже сказал, вставки выполняются с помощью (rowlock), и я использую для запросов уровень изоляции read uncommitted и nolock.

Когда я использую запросы к одной таблице, они работают отлично, но когда я пытаюсь присоединитьсяВ двух таблицах я получаю эту ошибку:

Транзакция (идентификатор процесса 88) заблокирована для ресурсов блокировки другого процесса и выбрана в качестве жертвы тупика.Перезапустите транзакцию.

Тем временем, если я использую процедуру sp_lock, я обнаружил, что блокировка клавиш становится блокировкой табуляции при выполнении моих запросов.

Кто-нибудь знает, существует ли особая связь между (nolock) и join?И если есть, как я могу избежать этого.

ОБНОВЛЕНИЕ:

Insert into tbl1 with (rowlock)
(
 col1,
 col2,
 col3
)
select * from #tbl_temp

(это бесконечный цикл, и данные из #tbl_temp всегда меняются.На самом деле это более сложный процесс, но это идея.)

Insert into tbl2 with (rowlock)
(
 col3,
 col4,
 col5
)

select * from #tbl_temp2 

В то же время я выполняю

set transaction isolation level read uncomitted

select col1,col2,col3 
from tbl1 with (nolock)  -- works fine


select col1,col2,a.col3 

from tbl1 with (nolock) join tbl2 with (nolock) on (tbl1.col3 = tbl2.col3)

- тупик

1 Ответ

0 голосов
/ 02 сентября 2011

Возможно, вы захотите включить READ_COMMITTED_SHAPSHOT уровень изоляции для вашей базы данных.

(но учтите, что это увеличит нагрузку на tempDB)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...