SQL Server Rowlock над выбором, если не существует вставка транзакции

StackOverflow https://stackoverflow.com/questions/4339320

Вопрос

Я обновил из 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 не имел бы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top