2013-07-09 5 views
0

Окружающая среда: SQL SERVER 2008 R2, Windows.Две разные транзакции, обновляющие разные строки одной таблицы в одно и то же время

CONNECTION-1: выполнение следующих

BEGIN TRANSACTION    

    UPDATE Check_lock with (rowlock) 
    set LayoutType = 98 
    where USERID between 1 and 7; 

    WAITFOR DELAY '000:10:00'; 

COMMIT TRANSACTION; 

CONNECTION-2: выполнение следующих

BEGIN TRANSACTION    

    UPDATE Check_lock with (rowlock) 
    set LayoutType = 98 
    where USERID between 15 and 20; 

COMMIT TRANSACTION; 

Постановка задачи: Я уверен, выполнение указанных сделок через SQL Server Management Studio с помощью делая одновременно два соединения с одним и тем же сервером/базой данных на одном компьютере. Хотя таблица такая же: & транзакции выполняются в одно и то же время (не на 100% в то же время, поскольку выполняется вручную), но при обновлении разных строк (блокировка на уровне строк), почему транзакция «Conneciton-2» не была немедленно передана и отправлена в ожидании, пока первая транзакция не будет выполнена/завершена. ??

Пожалуйста, дайте мне знать, если я не описал свой сценарий четко.

+0

Добро пожаловать в SO, вы должны добавить тег SQL к своему вопросу и не помещать свой адрес электронной почты в вопрос (вместо этого вы можете добавить его в свой профиль!) – Awalias

+3

Является ли 'USERID' индексированным? Используется ли индекс в плане выполнения? Если сканирование для поиска строк, соответствующих 'USERID между 15 и 20', будет заблокировано, ожидая, чтобы прочитать строки, заблокированные только первой транзакцией. –

+0

Зачем вы вводите код «WAITFOR DELAY» 000: 10: 00 '; – bgs

ответ

0

Я думаю, что это rthe причина:

«С (ROWLOCK) дает подсказку запроса для оптимизатора Если SQL так считает, он все еще может перерасти в ROWLOCK в замок страницы или блокировки таблицы Это будет.. обычно делайте это только в том случае, если вы нажимаете очень большое количество строк, но это в основном пытается избавить вас от необходимости использовать дополнительные ресурсы через множество блокировок строк ».

Эта цитата была взята из этого MSDN форум: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/60238304-04e8-4f98-84d1-3ddf1ed786a9/why-the-entire-table-is-locked-while-with-rowlock-is-used-in-a-update-statement

Создание индекса для столбца USERID (как сказал Мартин Смит) может помочь, так как SQL оптимизатор может использовать индекс и сделать вывод, что лучше замок строка, полное сканирование.

Смежные вопросы