1

我的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的脚本中发生错误时对数据库进行更改的情况下使用- 在上面这将是。如果我想在上面明确说明,那么它应该放在哪里?XCOMMIT 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
4

1 回答 1

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
于 2012-11-08T10:02:33.103 回答