[存储过程]中的事务(rollback)回滚
在编写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)回滚相关推荐
- springboot 事务手动回滚_Spring Boot中的事务是如何实现的
1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...
- 事物的开始和结束命令分别是什么_什么是事务事务中的提交和回滚是什么意思...
展开全部 1.事务就是指准备要做的或e5a48de588b662616964757a686964616f31333431356631所做的事情,在计算机语言中是指访问并可能更新数据库中各种数据项的一个 ...
- 【node】express中mysql的基本用法、连接池的使用、事务的回滚
[node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...
- spring事务——try{...}catch{...}中事务不回滚的几种处理方式
当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @ResponseBody@RequestMapping(value = "/payment" ...
- java事务中使用try catch 导致事务不回滚的问题
@Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常 解决方法: 1.方法前添加注解(基础的 @Trans ...
- sql 在存储过程中使用事务(转)
本来想自己写一下,后来发现这个写的比我理解的要好,所以直接拽过来了,链接地址:https://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737 ...
- mysql 存储过程 try catch_存储过程中使用事务与try catch
一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Cre ...
- 为什么catch了异常,但事务还是回滚了?
前几天我发了这篇文章<我来出个题:这个事务会不会回滚?>(https://blog.didispace.com/will-this-transcation-rollback/) 得到了很多 ...
- [20131014] 出现错误,显示事务没有回滚
[20131014] 出现错误,显示事务没有回滚 测试代码: SET XACT_ABORT OFF goBEGIN TRANBEGIN TRYDELETE dbo.T SELECT * FROM [不 ...
最新文章
- WinAPI: PtInRect - 判断点是否在矩形中
- oracle 一致性读数量,ORACLE 一致性读原理记录
- XML 命名空间(XML Namespaces)介绍以及节点读取方法
- GPIO做输出还能作外部中断输入吗?
- 深入探索 Java 热部署--转
- jni直接转byte_JNI再探之JNI 数据类型及Java与C++之间互调
- Python3-笔记-B-003-数据结构-元组tuple( )
- python的神经网络编程_Python神经网络编程 第二章 使用Python进行DIY
- 蒙特卡洛方法_【每日一题56】蒙特卡洛方法 用试验所得的频率估计事件发生概率...
- 你看,公司状告员工不加班,居然还告赢了
- openlayers 中的一些方法
- ubuntu16.04 安装cuda9.0+cudnn7.0.5+tensorflow+nvidia-docker配置GPU服务
- python --while 练习3
- js学习(three.js脚本)
- 【报告分享】2020大中华区人工智能成熟度调研:解码2020,展望数字未来.pdf(附下载链接)...
- 71. Simplify Path
- jquery easyUI第一篇【介绍、入门、使用常用的组件】
- 3分钟看懂 Linux 磁盘划分
- 下载时,要关闭休眠功能
- 【水果识别】基于matlab GUI阈值分类器草莓识别【含Matlab源码 653期】