Как управлять параллелизмом в SQL Server SELECT-запросах?Как управлять параллелизмом в SQL Server SELECT-запросах?
В этом случае эти SQL-запросы будут выполняться одновременно, но они не должны брать одну и ту же запись.
Как я мог справиться с этим?
Сессия 1:
BEGIN TRAN
DECLARE @Id INT
SELECT TOP 1 @Id = Id
FROM dbo.Table_1
UPDATE dbo.Table_1
SET is_taken = 1
WHERE Id = @Id
COMMIT TRAN
Сессия 2:
BEGIN TRAN
DECLARE @Id INT
SELECT TOP 1 @Id = Id
FROM dbo.Table_1
UPDATE dbo.Table_1
SET is_taken = 1
WHERE Id = @Id
COMMIT TRAN
Какая у вас настройка изоляции? –
Что значит, что они не должны брать одну и ту же запись? Вы используете верхнюю 1, но нет порядка, так что нет гарантии, какую строку вы вернете. –
Они никогда не смогут обновить одну и ту же запись - даже если оба они получат одинаковое значение @ @ id. Если # 1 получает блокировку обновления в строке с '@ Id', то # 2 не может запустить обновление - ему придется подождать, пока не будет # 1. –