有时候为了数据完整我们会启用到事务。正常的时候一帆风顺,如果rollback 呢?

最简单的一个回滚
IF OBJECT_ID('PROC1') IS NOT NULL
    DROP PROCEDURE dbo.PROC1;
GO
CREATE PROCEDURE PROC1
AS
    BEGIN
        BEGIN TRY
            BEGIN TRAN;
            SELECT  'Tran1' ,1;
            RAISERROR(16,1,1);
            SELECT  'Tran1' ,2;
            COMMIT TRAN;
        END TRY
        BEGIN CATCH
   SELECT  'Tran1' ,3;
            ROLLBACK TRAN;
            SELECT  'Tran1' ,4;
            RETURN -1;
        END CATCH;
 
    END;
GO
 
执行一下,抛出错误后继续向下执行。

当事务有嵌套的时候。在抛出错误的事务里面,会继续执行批处理剩下的语句,最后才回滚上去并往上层抛错误。非抛出层和最外层事务,语句运行至rollback就往上层抛。
如下
 
 
IF OBJECT_ID('PROC2') IS NOT NULL
 DROP PROCEDURE dbo.PROC2
go
CREATE PROCEDURE PROC2
AS
BEGIN
 BEGIN TRY
 BEGIN TRAN
  SELECT 'Tran2',1
  EXEC dbo.PROC1
  SELECT 'Tran2',2
 COMMIT TRAN
 END TRY
 BEGIN CATCH
  SELECT 'Tran2',3
  ROLLBACK TRAN
  SELECT 'Tran2',4
  RETURN -2
 END CATCH
END
GO
 
 
IF OBJECT_ID('PROC3') IS NOT NULL
 DROP PROCEDURE dbo.PROC3
go
CREATE PROCEDURE PROC3
AS
BEGIN
 BEGIN TRY
 BEGIN TRAN
  SELECT 'PROC3',1
  EXEC dbo.PROC2
  SELECT 'PROC3',2
 COMMIT TRAN
 END TRY
 BEGIN CATCH
  SELECT 'PROC3',3
  ROLLBACK TRAN
  SELECT 'PROC3',4
  RETURN -3
 END CATCH
END
GO
 
执行存储过程
SET NOCOUNT ON;
DECLARE @INT INT
EXEC @INT=dbo.PROC3
SELECT @INT
 
 
 
 

rollback在嵌套触发器中,如果在触发器的事务里面抛出错误,回滚之前触发器的语句修改,继续执行rollback之后的语句。但并不会激活之后的触发器
 
CREATE TABLE TestTR
(
 ID INT PRIMARY KEY,
 Name NVARCHAR(50)
)
 
CREATE TABLE TRTB1
(
 ID INT PRIMARY KEY,
 Col1 INT
)
 
CREATE TRIGGER TR_TESTTR1 ON dbo.TestTR AFTER
INSERT AS
BEGIN TRY
BEGIN TRAN
 INSERT INTO dbo.TRTB1
   ( ID, Col1 )
 VALUES  ( 1,
     CONVERT(INT,'a') )
COMMIT TRAN
END TRY
BEGIN CATCH
 ROLLBACK TRAN
 INSERT INTO dbo.TestTR
         ( ID, Name )
 VALUES  ( 1,
     CONVERT(INT,'2') )
END CATCH
GO
 
 
INSERT INTO TestTR ( ID, Name )
 VALUES  ( 4,
     CONVERT(INT,'3') )
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Rollback 语句 在08R2版本的更多相关文章

  1. MySQL 数据库SQL语句——高阶版本2

    MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...

  2. MySQL 数据库SQL语句——高阶版本1

    MySQL 数据库SQL语句--高阶版本 实验准备,数据表配置 mysql -uroot -p show databases; create database train_ticket; use tr ...

  3. IE中的if语句--实现不同版本IE浏览器不同html代码 (转)

    在很多html代码中常常可以看到很多的IE的条件语句,有时候很不明白他们的意思,其实这是为了能与低版本浏览器实现更好的兼容,例如在制作纯CSS的级联菜单时,由于在IE6中只有<a>支持伪类 ...

  4. 《oracle每天一练》触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句

    触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句 在触发器中不能运行 ddl语句和commit,rollback语句 ddl语句:DDL语句用语定义和管理数据库中的对象,如Creat ...

  5. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  6. Centos7使用Yum安装高版本的LNMP

    [摘要] 本文旨在介绍使用yum的方式安装一些高版本的NGINX.MySQL.PHP服务.当然如果觉得红帽给的就够用,就用红帽给的就行. 在红帽系列的Linux操作系统中,nginx/mysql/ph ...

  7. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  8. select语句for update---转载

    作用: Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就 ...

  9. MySQL数据库学习笔记(三)----基本的SQL语句

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. BaseAdapter的getView()方法

    getView()是BaseAdapter的一个重要方法.为了研究getView()方法,使用了以下的类. // apk列表 class list_apk extends BaseAdapter{ p ...

  2. JavaScript中JSON的处理心得

    一门语言用到深处,就避免不了要对数据的类型进行准确判断,并针对其类型做正确处理. 抛开在Web前端环境不谈,从一门独立编程语言的角度来看js,你就会感受到对js中数据类型的理解有多么重要. 禁止直接多 ...

  3. 基于Erlang VM的函数式编程语言Elixir

    Elixir官网:http://elixir-lang.org/ Elixir是一种函数式动态语言,用于构建可伸缩.易维护的应用程序. Elixir是基于Erlang VM的,其广为人知的特点是运行低 ...

  4. SpringMVC框架介绍

     1. SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口. 2.支持REST风格的URL请求. 3.采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵 ...

  5. MetricGraphics.js – 时间序列数据的可视化

    MetricsGraphics.js 是建立在D3的基础上,被用于可视化和布局的时间序列数据进行了优化.它提供以产生一个原则性的,一致的和响应式的方式的图形常见类型的简单方法.该库目前支持折线图,散点 ...

  6. Hexo部署到GitHub出现spawn ENOENT的解决办法

    最近用Hexo博客部署到GitHub时出现了这如下的错误: Error: spawn ENOENT at errnoException (child_process.js:980:11) at Pro ...

  7. SVN源码泄露漏洞

    SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范.“在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息 ...

  8. SharePoint 2010 网站备份还原简单介绍

    今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...

  9. 源码详解openfire保存消息记录_修改服务端方式

    实现openfire消息记录通常有两种方式,修改服务端和添加消息记录插件. 今天,简单的说明一下修改服务端方式实现消息记录保存功能. 实现思路 修改前: 默认的,openfire只提供保存离线记录至o ...

  10. 属性(@property)、@synthesize

    先前我们学的实例变量是这样的 { int _age; int _height; int age; } 后来学属性 @property int age; 看到@property 会自动编译生成某个成员变 ...