我一直在尝试在网上查找有关这些语句之间差异的信息,在我看来它们是相同的,但我找不到对此或任何形式的比较的确认。
这样做之间有什么区别:
BEGIN -- Some update, insert, set statements END
并这样做
BEGIN TRANS -- Some update, insert, set statements COMMIT TRANS
?
请注意,仅在某些异常或超时或其他一般故障的情况下才需要回滚,而不会有条件地回滚。
BEGIN和END处理代码块。它们类似于您在多种语言中看到的花括号:
if (somethingIsTrue) { // like BEGIN // do something here } // like END
在SQL中,这是:
if somethingIsTrue BEGIN -- do something here END
BEGIN TRAN,COMMIT以及ROLLBACK开始和结束 交易 。他们没有指定新的代码块;它们仅标记交易边界。
BEGIN TRAN
COMMIT
ROLLBACK
注意,你可以写一个BEGINTRAN,并COMMIT在单独的代码块。例如,如果您希望代码成为事务的一部分,但是如果代码已经在事务中,则不想启动新代码,则可以执行以下操作:
BEGINTRAN
declare @TranStarted bit = 0 if @@trancount = 0 begin set @TranStarted = 1 begin tran end -- ... do work ... if @TranStarted = 1 begin commit set @TranStarted = 0 end