Пессимистическая блокировка в T-SQL - PullRequest
5 голосов
/ 22 декабря 2008

Если я ВЫБИРАЮ строку для обновления в MS SQL Server и хочу заблокировать ее, пока я не обновлю или не отменю, какой вариант лучше: -

1) Используйте подсказку запроса, например, UPDLOCK 2) Используйте уровень изоляции REPEATABLE READ для транзакции 3) любой другой вариант.

Спасибо, Чак.

Ответы [ 3 ]

8 голосов
/ 22 декабря 2008

Если вы ждете на другом ресурсе, таком как конечный пользователь, примите совет Дэйва Маркла и не делайте этого.

В противном случае попробуйте следующий код T-SQL:

BEGIN TRAN

SELECT *
FROM   authors AU
WITH   (HOLDLOCK, ROWLOCK)
WHERE  AU.au_id = '274-80-9391'

/* Do all your stuff here while the row is locked */

COMMIT TRAN

Подсказка HOLDLOCK вежливо просит SQL Server удерживать блокировку до тех пор, пока вы не совершите транзакцию. Подсказка ROWLOCK вежливо просит SQL Server заблокировать только эту строку, а не блокировать страницу или таблицу.

Имейте в виду, что если затронуто множество строк, либо SQL Server возьмет на себя инициативу и перерастет в блокировки страниц, либо у вас будет целая армия блокировок строк, заполняющих память сервера и замедляющих обработку.

3 голосов
/ 22 декабря 2008

Ни. Вы почти никогда не хотите держать транзакцию открытой, пока ваш пользователь вводит данные. Если у вас есть для реализации пессимистической блокировки, подобной этой, люди обычно делают это, используя свои собственные функции.

Подумайте о возможных последствиях того, что вы делаете. Однажды я работал над системой, в которой реализована блокировка. Вы часто сталкиваетесь с тоннами устаревших блокировок, и ваши пользователи очень быстро запутываются и злятся, когда вы навязываете им это. Решением для нас в нашем случае было полное удаление этой функциональности блокировки.

0 голосов
/ 22 декабря 2008

просто обратите внимание, что, несмотря на использование ROWLOCK, SQL Server может по-прежнему брать полную блокировку страницы, если сочтет это необходимым.

...