我在某些情况下看到了交易使用情况,但从未真正理解应该在哪些情况下使用它们。应该如何以及何时使用交易(开始交易声明)?我已经读过微软不建议在触发器和存储过程中使用事务语句(commit,rollback)。
答案 0 :(得分:5)
在插入或操作数据时,事务可以与存储过程或SQL脚本中的错误处理结合使用,以确保一切都是一致的。
例如,如果您有一个将记录插入父表和子表的存储过程,则需要确保首先插入父记录;如果失败,您可以回滚您的更改,以便您没有孤立的子记录。
Erland Sommarskog有一个关于如何在SQL Server中使用错误处理的great article。
最后,Microsoft建议不在存储过程中使用事务?我认为存储过程是使用它们的理想场所。
答案 1 :(得分:2)
如果我将moey从一个帐户转移到另一个帐户,我希望它100%成功或100%失败:
UPDATE PersonalAccount SET Balance = Balance - 100 WHERE Username = 'gbn'
--what if the server caught fire here?
UPDATE SavingsAccount SET Balance = Balance + 100 WHERE Username = 'gbn'
至于你所阅读的内容,除了不需要在触发器中使用BEGIN TRAN外,完成垃圾。
来自“Nested stored procedures containing TRY CATCH ROLLBACK pattern?”
的示例