SQL Server Rowlock над выбором, если не существует вставка транзакции
-
30-09-2019 - |
Вопрос
Я обновил из SQL Server 2005 до 2008 года. Я помню, что в 2005 году Rowlock просто не работал, и мне пришлось использовать PageLock или XLoce для достижения любого типа фактического блокировки. Я знаю, что читатель этого спросит: «Что ты сделал не так?» Ничего. Я окончательно доказал, что могу редактировать «щебень» ряд, но не могло бы, если я обострил уровень блокировки. У меня не было возможности посмотреть, если это работает в SQL 2008. Мой первый вопрос у вас есть кто-то, кто сталкивается с этим вопросом в 2008 году?
Мой второй вопрос выглядит следующим образом. Я хочу проверить, существует ли значение, и если это так, выполните обновление на соответствующих столбцах, а не вставку всей строки. Это означает, что если ряд найден, она должна быть заблокирована, поскольку процедура обслуживания может удалить эту строку в середине процесса, вызывая ошибку.
Чтобы проиллюстрировать принцип, будет работать следующий код?
BEGIN TRAN
SELECT ProfileID
FROM dbo.UseSessions
WITH (ROWLOCK)
WHERE (ProfileID = @ProfileID)
OPTION (OPTIMIZE FOR (@ProfileID UNKNOWN))
if @@ROWCOUNT = 0 begin
INSERT INTO dbo.UserSessions (ProfileID, SessionID)
VALUES (@ProfileID, @SessionID)
end else begin
UPDATE dbo.UserSessions
SET SessionID = @SessionID, Created = GETDATE()
WHERE (ProfileID = @ProfileID)
end
COMMIT TRAN
Решение
Объяснение...
- Rowlock / Pagelock - гранулярность
- Xlock - это режим
Граничность и уровень изоляции и режим являются ортогональными.
Гранулярность = что заблокировано = строка, страница, таблица (
PAGLOCK, ROWLOCK, TABLOCK
)Уровень изоляции = Продолжительность блокировки, параллелизм (
HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE
)Режим = обмен / эксклюзивность (
UPDLOCK, XLOCK
)«Объединенный», например,
NOLOCK, TABLOCKX
XLOCK заблокировал бы ряд исключительно, как вы хотите. Rowlock / Pagelock не имел бы.