zoukankan      html  css  js  c++  java
  • SQL Server TransAction 全部回滚

    使用的表结构如下:

    USE [TestDB]
    GO
    /****** 对象:  Table [dbo].[Person]    脚本日期: 11/23/2008 13:37:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Person](
        
    [PersonId] [nchar](18NOT NULL,
        
    [PersonName] [nchar](20NOT NULL,
     
    CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
    (
        
    [PersonId] ASC
    )
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY]
    ON [PRIMARY]

    默认情况下如果执行一个事务中出现错误,则只回滚错误操作语句(就是说这句不执行了,算不上回滚),错误处之前或之后的正确操作语句还是会被提交。如:

    Use TestDB

    Begin TransAction
        
    Insert Into Person(PersonId,PersonName)
                    
    Values('1','Name1')
        
    Insert Into Person(PersonId,PersonName)
                    
    Values('1','Name1')
        
    Insert Into Person(PersonId,PersonName)
                    
    Values('3','Name3')
    Commit TransAction
    /*
        Select 一下 有'1','Name1'和'3','Name3',
        说明只有第二句的错误被取消了
    */

    全部回滚的方法1:打开 XACT_ABORT

    Use TestDB
    SET XACT_ABORT ON -- 打开
    Begin TransAction
        
    Insert Into Person(PersonId,PersonName)
                    
    Values('1','Name1')
        
    Insert Into Person(PersonId,PersonName)
                    
    Values('1','Name1')
        
    Insert Into Person(PersonId,PersonName)
                    
    Values('3','Name3')
    Commit TransAction
    /*
        当 SET XACT_ABORT 为 ON 时,
        如果执行 Transact-SQL 语句产生运行时错误,
        则整个事务将终止并回滚。 
        默认情况下它是OFF状态。
    */

    全部回滚方法2:使用Try...Catch

    Use TestDB
    Begin Try
        
    Begin TransAction
            
    Insert Into Person(PersonId,PersonName)
                        
    Values('1','Name1')
            
    Insert Into Person(PersonId,PersonName)
                        
    Values('1','Name1')
            
    Insert Into Person(PersonId,PersonName)
                        
    Values('3','Name3')
        
    Commit TransAction
    End Try
    Begin Catch
        
    Rollback TransAction
    End Catch
    /*
        使用TryCatch来捕获异常。
        如果 TRY 块内生成的错误导致当前事务的状态失效,
        则将该事务归类为不可提交的事务。
        如果通常在 TRY 块外中止事务的错误在 TRY 内发生时,
        就会导致事务进入不可提交状态。
        不可提交的事务只能执行读操作或 ROLLBACK TRANSACTION。
        该事务不能执行任何可能生成写操作或 COMMIT TRANSACTION 的 Transact-SQL 语句。
        如果事务被分类为不可提交的事务,则 XACT_STATE 函数会返回值 -1。
    */

    全部回滚方法3:自定义错误变量

    Use TestDB
    Declare @tranError int -- 定义变量
    Set @tranError=0
        
    Begin TransAction
            
    Insert Into Person(PersonId,PersonName)
                        
    Values('1','Name1')
                
    Set @tranError = @tranError + @@Error
            
    Insert Into Person(PersonId,PersonName)
                        
    Values('1','Name1')
                
    Set @tranError = @tranError + @@Error
            
    Insert Into Person(PersonId,PersonName)
                        
    Values('3','Name3')
                
    Set @tranError = @tranError + @@Error
        
    If @tranError = 0
            
    Commit TransAction
        
    Else
            
    Rollback TransAction
    /*
        自定义一个变量来判断最后是否发生过错误。
    */

    最后要注意的是:如果一个事务写了 Begin TransAction 而没写 Commit TransAction 或 Rollback TransAction 则相关操作的数据(也许是表,也许是列,这我还没测试。。。)会被锁住。。。而对于锁住的解决办法就是单独执行一下Commit TransAction 或 Rollback TransAction

  • 相关阅读:
    LeetCode 485. Max Consecutive Ones
    LeetCode 367. Valid Perfect Square
    LeetCode 375. Guess Number Higher or Lower II
    LeetCode 374. Guess Number Higher or Lower
    LeetCode Word Pattern II
    LeetCode Arranging Coins
    LeetCode 422. Valid Word Square
    Session 共享
    java NIO
    非阻塞IO
  • 原文地址:https://www.cnblogs.com/engine1984/p/1364518.html
Copyright © 2011-2022 走看看