测试插入/更新失败并回滚此事务(如果有)的正确方法是什么?我认为我所拥有的不会起作用,因为我的插入/更新是 3 个单独的语句,并且 @@ROWCOUNT 将仅反射(reflect)最后执行的语句。
BEGIN TRANSACTION Script;
GO
INSERT INTO TableA (id) VALUES (1)
INSERT INTO TableB (id) VALUES (1)
UPDATE TableC SET id=1 WHERE id=2
GO
IF (@@ROWCOUNT=3 AND @@ERROR=0)
BEGIN
COMMIT
END
ELSE
BEGIN
PRINT 'Error: Rolling back transaction'
ROLLBACK TRANSACTION Script
END
GO
最佳答案
如果在开始事务之前将 SET XACT_ABORT 设置为 ON,in case of an error, rollback will be issued automatically .
SET XACT_ABORT ON
begin transaction
INSERT INTO TableA (id) VALUES (1)
INSERT INTO TableB (id) VALUES (1)
UPDATE TableC SET id=1 WHERE id=2
commit transaction
如果你想自己回滚,use try .. catch block .
begin transaction
begin try
INSERT INTO TableA (id) VALUES (1)
INSERT INTO TableB (id) VALUES (1)
UPDATE TableC SET id=1 WHERE id=2
commit transaction
end try
begin catch
raiserror('Message here', 16, 1)
rollback transaction
end catch
关于sql-server - 围绕多个插入或更新使用事务的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10302697/