使用的表结构如下:

 USE [TestDB]GO/****** 对象:  Table [dbo].[Person]    脚本日期: 11/23/2008 13:37:48 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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 TestDBBegin 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 TestDBSET 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 TestDBBegin 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 TransActionEnd TryBegin Catch    Rollback TransActionEnd Catch/*    使用TryCatch来捕获异常。    如果 TRY 块内生成的错误导致当前事务的状态失效,    则将该事务归类为不可提交的事务。    如果通常在 TRY 块外中止事务的错误在 TRY 内发生时,    就会导致事务进入不可提交状态。    不可提交的事务只能执行读操作或 ROLLBACK TRANSACTION。    该事务不能执行任何可能生成写操作或 COMMIT TRANSACTION 的 Transact-SQL 语句。    如果事务被分类为不可提交的事务,则 XACT_STATE 函数会返回值 -1。*/  

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

 Use TestDBDeclare @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

MSSQL Server Transaction 数据库事务回滚的用法的更多相关文章

  1. ThinkPHP 实现数据库事务回滚示例代码

    ThinkPHP提供了数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法:   启动事务: $User->startTrans(); 提交事务: $User->commit( ...

  2. Java进阶知识24 Spring的事务管理(事务回滚)

    1.事务控制概述   1.1.编程式事务控制         自己手动控制事务,就叫做编程式事务控制.         Jdbc代码: connection.setAutoCommit(false); ...

  3. transaction 数据库事务 roolback 回滚

    事务是恢复和并发控制的基本单位 https://baike.baidu.com/item/数据库事务/9744607 事务有三种模型: 1.隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开 ...

  4. mysql数据库 索引 事务和事务回滚

    mysql索引 索引相当于书的目录优点:加快数据的查询速度缺点:占物理存储空间,添加,删除,会减慢写的速度 查看表使用的索引 mysql> show index from 表名\G;(\G分行显 ...

  5. SQL Server事务回滚对自增键的影响

    SQL Server事务回滚时是删除原先插入导致的自增值,也就是回滚之前你你插入一条数据导致自增键加1,回滚之后还是加1的状态 --如果获取当前操作最后插入的identity列的值:select @@ ...

  6. spring @Transaction事务回滚失败

    今天客户提出一个新问题,出库一批商品,提示失败了,但是库存数量却减少了.看了一下代码一头雾水,我们的代码加了事物,且捕获异常. 经过调试代码发现就是两个原因导致的 第一.在当前方法的catch中处理了 ...

  7. SqlServer事务回滚(2)

    SQL Server 2008中SQL应用系列--目录索引 SQL事务 一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是 ...

  8. [转] C# mysql 事务回滚

    什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...

  9. mysql事务回滚机制概述

    应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用 ...

随机推荐

  1. 使用oschina的git服务器

    初始配置 用注册的用户名和邮箱配置git config,这个信息不一定是你在网站注册的内容. git config --global user.name "" git config ...

  2. (转)linux中fork()函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  3. 适配6 、6P 来源互联网

    iPhone 6 6P出现后,如何将一份设计稿支持多个尺寸? 如何只出一套iOS平台设计稿?随着苹果发布两种新尺寸的大屏iPhone 6,下面三款iPhone尺寸和分辨率数据就知道屏幕有多杂了. 现在 ...

  4. Python标准库10 多进程初步 (multiprocessing包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经见过了使用subprocess包来创建子进程,但这个包有两个很大的局限性: ...

  5. [AIR] 在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持

    转自:http://www.adobe.com/cn/devnet/air/articles/multiple-screen-sizes.html 无论是改编原本在浏览器 Flash Player 中 ...

  6. Intellisense in Visual Studio for Microsoft Dynamics CRM 2016

    Intellisense in Visual Studio for Microsoft Dynamics CRM 2016 posted by dynamicsnick on may 18, 2016 ...

  7. nyoj 91 阶乘之和

    点击打开链接 阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度: 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2 ...

  8. java爬虫实战

    1.下载jxl.jar包,网上多的是 2.编写如下代码: package com.beyond.url; import java.io.BufferedReader;import java.io.Fi ...

  9. 用js控制选项卡的隐藏与显示

    通过使用ul和div来,借助于jquery来实现选项卡的显示与隐藏 <form action="" method="post"> <div&g ...

  10. 在 Visual Studio 2013 中使用 Grunt, Bower 和 NPM

    在 Visual Studio 2015 中提供了对于 Grunt 和 Gulp 的内置支持,在 Visual Studio 2013 中怎么办呢?微软将 2015 中的特性作为几个独立的扩展发布出来 ...