我们需要更新一组表,这应该在1个事务的范围内完成。
我的同事建议采用以下方法
Begin Tran
Declare @tmp Table (id int);
UPDATE tbl1
SET --set some fields
, [Status] = 3
Output deleted.Status
Into @tmp
WHERE ID = @Given_ID
AND [Status] = 7
If Exists( SELECT 1
FROM @tmp
WHERE id = 7)
BEGIN
-- Do some other updates and inserts
.....
Commit Tran
RETURN 1
END
rollback Tran
RETURN 0
我的建议如下:
Begin tran
If Exists( SELECT 1
FROM tbl1 WITH (updlock, holdlock)
WHERE [status] = 7 AND ID=@Given_ID)
BEGIN
UPDATE tbl1
SET ...
, [Status] = 3
WHERE ID = @Given_ID
AND [Status] = 7
-- Do some other updates and inserts
.....
Commit tran
Return 1
END
rollback Tran
RETURN 0
您能否指出哪种方法更好并解释原因? 我们可以做得更好吗?
提前致谢。
答案 0 :(得分:0)
最直接的方法是找出两个问题, 并将它们放入SQL Server Management工作室,然后按下显示估计查询计划的按钮。 (或切换"显示查询计划"然后运行查询...)
如果两个查询并排运行,它将显示" cost"相互比较。这个原因只是"最好的"在表现方面。 两个查询似乎都可以锁定一个事务。
在查询格式和方法方面,这是一个意见问题。