sql rowlock в операторе выбора - PullRequest
5 голосов
/ 20 апреля 2010

У меня есть веб-страница ASP.Net, где пользователь выбирает строку для редактирования.Я хочу использовать блокировку строки в этой строке, и как только пользователь завершит редактирование и обновит, другой пользователь сможет редактировать эту строку, т.е. как я могу использовать блокировку строки, чтобы только один пользователь мог редактировать строку?

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 июля 2015

Здесь я даю два набора sql для блокировки строк во время оператора select.

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 проявит инициативу и перейдет на страницублокировок, или у вас будет целая армия блокировок строк, заполняющих память вашего сервера и замедляющих обработку.

еще одна

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 

еще одна хорошая ссылка, которой я хочу поделиться с вами при блокировке,https://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/

спасибо

4 голосов
/ 20 апреля 2010

Вы не можете заблокировать строку, используя блокировку движка БД.

Большинство других стратегий полагались бы на поддержание открытого соединения (например, sp_getapplock), и это бессмысленно в веб-приложениях.

Даже если вы установите флаг в строке, что произойдет, если пользователь просто закроет браузер в середине редактирования?

Я бы предложил использовать столбец метки времени / строки для обнаружения изменений в строке в других сеансах.

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