码迷,mamicode.com
首页 > 数据库 > 详细

MSSQL Tran 数据库事务回滚的用法

时间:2015-12-09 19:24:40      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

使用的表结构如下:

技术分享
技术分享
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](18) NOT NULL,
    [PersonName] [nchar](20) NOT 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  = ON) ON [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
/*
    使用Try技术分享Catch来捕获异常。
    如果 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
/*
    自定义一个变量来判断最后是否发生过错误。
*/
技术分享
技术分享

MSSQL Tran 数据库事务回滚的用法

标签:

原文地址:http://www.cnblogs.com/andy105090/p/5033489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!