如果不回滚,ROLLBACK TRANSACTION是否意味着提交

时间:2012-11-08 09:57:29

标签: sql sql-server tsql sql-server-2008-r2

我的SQL-Server学习曲线已经回到前面,几年后我正在努力有效地使用TRANSACTION代码。

如果没有明确说明COMMIT TRANSACTION,那么在ROLLBACK TRANSACTION点如果前面的代码中没有发生错误,那么交易会被提交吗?问题与以下结构有关:

USE MyDataBase;
GO
     BEGIN TRANSACTION;
        --complex query X here  
     ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.';
GO

...我认为ROLLBACK TRANSACTION用于你不希望在前面的脚本中发生错误的情况下对数据库进行更改的情况 - 在上面这将是X。如果我想在上面明确说明COMMIT TRANSACTION那么它应该位于何处?

为了让自己更加困惑,我得到了以下内容 - 为什么要回滚两次?创建ROLLBACK是否会出错?

USE WHAnalysis;
GO
    BEGIN TRANSACTION;

        IF @@TRANCOUNT = 1
            SELECT @@TRANCOUNT
            --do a complex query here

    ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.';
GO

1 个答案:

答案 0 :(得分:0)

没有。在提交之前,事务将保持打开和未提交,这最终可能会导致数据库阻塞。

如果事务是嵌套的,则回滚将回滚到外部事务的开头,而不是内部事务 - 请参阅http://msdn.microsoft.com/en-us/library/ms181299.aspx

我会考虑类似

的结构
 begin try
      begin tran
      -- do query
      commit tran
 end try
 begin catch
      if @@trancount>0 
      begin
          rollback
      end
      -- handle error here
 end catch