Я пытаюсь предоставить эксклюзивный доступ для чтения к критическому разделу среди параллельных потоков.Однако сериализуемого уровня изоляции недостаточно, поскольку блокировка чтения не происходит до тех пор, пока не будет выполнено обновление, а не после первоначального чтения, когда это необходимо, чтобы избежать условия гонки ниже.
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;