Можно ли заблокировать чтение таблицы / строки в транзакции без ее предварительного обновления? - PullRequest
0 голосов
/ 22 мая 2018

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

DECLARE @x INT

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION 

    -- need to read-block other threads here
    SELECT @x = field1 FROM transtest WHERE id = 1;

    SET @x = @x + 1;

    UPDATE transtest SET field1 = @x WHERE id = 1;

COMMIT TRANSACTION

Помимо выпуска «мягкого» обновления для запуска блокировки чтения, как в следующем примере, есть ли более прямой способ его получения?

UPDATE transtest 
SET field1 = (SELECT field1 FROM transtest WHERE id = 1) 
WHERE id = 1;

1 Ответ

0 голосов
/ 22 мая 2018

Почему ты не можешь просто сделать это?

UPDATE transtest SET field1 = field1 + 1 WHERE id = 1;

ОП сказал, что другие вещи продолжаются.Я думаю, что это сделает это.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION 

    -- need to read-block other threads here
    SELECT @x = field1 + 1 
    FROM transtest with (rowlock uplock)
    WHERE id = 1;

    //other stuff

    UPDATE transtest SET field1 = @x WHERE id = 1;

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