在資料庫使用 Transaction 時,最怕的就是資料表被鎖定,導致其它的查詢被迫等待。基於這原因,查詢資料後發現最保險的作法是使用 Stored Procedure 來更新資料,而且只鎖定在單一筆資料。

方法很單純,SQL 語法如下:

CREATE PROCEDURE [dbo].[UpdatePrice]
(
    @id nvarchar(500), -- cannot be NULL
    @price int
)
AS
BEGIN
	SET NOCOUNT ON;
	BEGIN TRANSACTION
	update Product WITH (ROWLOCK) set Price = @price
	where ProductId = @id waitfor delay '00:00:15';
	select Price from Product WITH (UPDLOCK) where ProductId = @id;
	COMMIT TRANSACTION
END

delay '00:00:15' 這一行單純只是等待15秒,以便測試其它的查詢是否會因此卡住。

參考資料