在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法:

begin tran

update statement 1 ...

update statement 2 ...

delete statement 3 ...

commit tran

这样编写的SQL存在很大隐患。请看下面的例子:

create table demo(id int not null)

go

begin tran

insert into demo values (null)

insert into demo values (2)

commit tran

go

执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。 我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。 这是什么原因呢? 原来 SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。

1. 在事务语句最前面加上set xact_abort on

set xact_abort on

begin tran

update statement 1 ...

update statement 2 ...

delete statement 3 ...

commit tran

go

当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。  这个意思是说,如果该事务中包含子事务,子事务也会回滚。

2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。

begin tran

update statement 1 ...

if @@error <> 0

begin rollback tran

goto labend

end

delete statement 2 ...

if @@error <> 0

begin rollback tran

goto labend

end

commit tran

labend:

go

3. 在SQL Server 2005中,可利用 try...catch 异常处理机制。

begin tran

begin try

update statement 1 ...

delete statement 2 ...

endtry

begin catch

if @@trancount > 0

rollback tran

end catch

if @@trancount > 0

commit tran

go

下面是个简单的存储过程,演示事务处理过程。

create procedure dbo.pr_tran_inproc as begin set nocount on

begin tran

update statement 1 ...

if @@error <> 0

begin rollback tran

return -1 end

delete statement 2 ...

if @@error <> 0

begin rollback tran

return -1

end commit tran

return 0

end

go

原文出处:http://blog.csdn.net/healingangle/article/details/24999175

转载于:https://www.cnblogs.com/johnblogs/p/7505793.html

[存储过程]中的事务(rollback)回滚相关推荐

  1. springboot 事务手动回滚_Spring Boot中的事务是如何实现的

    1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...

  2. 事物的开始和结束命令分别是什么_什么是事务事务中的提交和回滚是什么意思...

    展开全部 1.事务就是指准备要做的或e5a48de588b662616964757a686964616f31333431356631所做的事情,在计算机语言中是指访问并可能更新数据库中各种数据项的一个 ...

  3. 【node】express中mysql的基本用法、连接池的使用、事务的回滚

    [node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...

  4. spring事务——try{...}catch{...}中事务不回滚的几种处理方式

    当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @ResponseBody@RequestMapping(value = "/payment" ...

  5. java事务中使用try catch 导致事务不回滚的问题

    @Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常 解决方法: 1.方法前添加注解(基础的  @Trans ...

  6. sql 在存储过程中使用事务(转)

    本来想自己写一下,后来发现这个写的比我理解的要好,所以直接拽过来了,链接地址:https://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737 ...

  7. mysql 存储过程 try catch_存储过程中使用事务与try catch

    一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Cre ...

  8. 为什么catch了异常,但事务还是回滚了?

    前几天我发了这篇文章<我来出个题:这个事务会不会回滚?>(https://blog.didispace.com/will-this-transcation-rollback/) 得到了很多 ...

  9. [20131014] 出现错误,显示事务没有回滚

    [20131014] 出现错误,显示事务没有回滚 测试代码: SET XACT_ABORT OFF goBEGIN TRANBEGIN TRYDELETE dbo.T SELECT * FROM [不 ...

最新文章

  1. WinAPI: PtInRect - 判断点是否在矩形中
  2. oracle 一致性读数量,ORACLE 一致性读原理记录
  3. XML 命名空间(XML Namespaces)介绍以及节点读取方法
  4. GPIO做输出还能作外部中断输入吗?
  5. 深入探索 Java 热部署--转
  6. jni直接转byte_JNI再探之JNI 数据类型及Java与C++之间互调
  7. Python3-笔记-B-003-数据结构-元组tuple( )
  8. python的神经网络编程_Python神经网络编程 第二章 使用Python进行DIY
  9. 蒙特卡洛方法_【每日一题56】蒙特卡洛方法 用试验所得的频率估计事件发生概率...
  10. 你看,公司状告员工不加班,居然还告赢了
  11. openlayers 中的一些方法
  12. ubuntu16.04 安装cuda9.0+cudnn7.0.5+tensorflow+nvidia-docker配置GPU服务
  13. python --while 练习3
  14. js学习(three.js脚本)
  15. 【报告分享】2020大中华区人工智能成熟度调研:解码2020,展望数字未来.pdf(附下载链接)...
  16. 71. Simplify Path
  17. jquery easyUI第一篇【介绍、入门、使用常用的组件】
  18. 3分钟看懂 Linux 磁盘划分
  19. 下载时,要关闭休眠功能
  20. 【水果识别】基于matlab GUI阈值分类器草莓识别【含Matlab源码 653期】

热门文章

  1. 遇到的问题锦集及解决方案
  2. android 上传文件到服务器
  3. 最短路算法整理 1557 热浪
  4. ob_start()失效与phpunit的非正常结束
  5. lvs+keepalived 集群
  6. 一个浏览器插件,测试xpath的工具
  7. influxDB+grafana 日志监控平台(Golang)
  8. Oracle统计信息不准(谓词越界)造成的性能问题
  9. 46.Express框架 GET 方法和POST 方法
  10. 推荐一些好的linux学习网站