#sql-server #transactions #block #hint
#sql-сервер #транзакции #блокировать #подсказка
Вопрос:
Я использую эту транзакцию в SQL Server Managemnet studio 2012
begin transaction
Select *
from tabl1 with(xlock, rowlock)
where ID = 1153;
select * from Table2;
rollback
Я поставил точку останова во втором запросе. Первый запрос заблокирует строку Pieza с идентификатором 1153, пока транзакция не зафиксирована или не откатывается, поэтому, когда код останавливается в точке останова, в другом экземпляре SQL Server Management studio я делаю:
select * from Table1
Я думаю, что этот запрос будет выполняться до тех пор, пока не завершится транзакция первого SQL Server management studio, но запрос las может завершиться без проблем.
Однако, если я сделаю это в T-SQL в транзакции с EF, строка будет заблокирована.
Я тоже пытался:
начать транзакцию, выбрав * из таблицы1 с помощью (xlock, rowlock), где ID = 1153; перейти к выбору * из таблицы2; откат
Но это не решает проблему.
Как я могу попробовать подсказки SQL Server в Management Studio?
Спасибо.
Редактировать:
Эта транзакция блокирует строку:
начать транзакцию Выберите * из tabl1 с помощью (xlock, rowlock);
select * from Table2;
rollback
Поэтому, когда я устанавливаю условие, подобное идентификатору, строка не блокируется.
Ответ №1:
Из: http://msdn.microsoft.com/en-us/library/ms187373.aspx
Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on
index keys rather than the actual data rows. For example, if a table has a nonclustered index,
and a SELECT statement using a lock hint is handled by a covering index, a lock is acquired on
the index key in the covering index rather than on the data row in the base table.
Таким образом, может быть, что индекс удовлетворяет первому запросу, но второй (SELECT * ) может быть удовлетворен только индексом clusterd.
Комментарии:
1. Итак, есть какой-либо способ заблокировать строку в любом случае, когда я использую индекс и когда я не использую индекс? Спасибо.
2. Я думаю, это зависит от того, какую операцию вы выполняете. Выбранные блокировки совместимы и не будут блокировать друг друга. С другой стороны, если бы вы обновляли строку, select пришлось бы ждать завершения этой операции. Здесь есть хорошая таблица, которая помогает объяснить это: technet.microsoft.com/en-us/library/ms186396 (v=sql.105).aspx
3. Мне нужно заблокировать в select, потому что таким образом я должен убедиться, что любая другая строка, связанная с этой строкой, обновляется другим пользователем, и информация не является согласованной. Я имею в виду, что у меня есть группа строк, которые мне нужно обновить все или ничего, и блокировка ссылочной строки — это способ, который я нахожу для этого. Потому что в противном случае он выполняет поддельное обновление, чтобы заблокировать строку. Но мне не нравится это решение, потому что выполните еще один обратный переход к базе данных.
4. Использование внешних ключей обеспечит целостность между двумя таблицами. Это приведет к соответствующим блокировкам для обоих.