在存储过程中编写正确的事务处理代码
在 SQL Server 中数据库事务处理是个重要的概念,也稍微有些不容易理解,很多 SQL 初学者编写的事务处理代码存往往存在漏洞,
本文介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。
在编写 SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法:
begin tranupdate statement 1 ...update statement 2 ...delete statement 3 ...commit tran
这样编写的SQL存在很大隐患。请看下面的例子:
create table demo(id int not null)gobegin traninsert into demo values (null)insert into demo values (2)commit trango
执行时会出现一个违反 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 onbegin tranupdate statement 1 ...update statement 2 ...delete statement 3 ...commit trango
当 xact_abort 选项为 on 时,sql server 在遇到错误时会终止执行并 rollback 整个事务。
2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。
begin tranupdate statement 1 ...if @@error <> 0 beginrollback trangoto labendenddelete statement 2 ...if @@error <> 0 beginrollback trangoto labendendcommit tranlabend:go
3. 在SQL Server 2005中,可利用 try...catch 异常处理机制
begin tranbegin tryupdate statement 1 ...delete statement 2 ...end trybegin catchif @@trancount > 0rollback tranend catchif @@trancount > 0commit trango
下面是个简单的存储过程,演示事务处理过程。
create procedure dbo.pr_tran_inprocasbeginset nocount onbegin tranupdate statement 1 ...if @@error <> 0 beginrollback tranreturn -1enddelete statement 2 ...if @@error <> 0 beginrollback tranreturn -1endcommit tranreturn 0endgo
转载于:https://www.cnblogs.com/tonykan/p/3795878.html
在存储过程中编写正确的事务处理代码相关推荐
- SQL Server在存储过程中编写事务处理代码的三种方法
SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...
- 如何在Java中编写正确的微基准测试?
您如何用Java编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,以说明要考虑的各种问题. 示例:基准测试应测量时间/迭代或迭代/时间,为什么? 相关: 秒表基准测试是否可以接受? #1 ...
- [转]敏捷开发中编写高质量Java代码
本文转自:http://dev.yesky.com/103/11164603.shtml 敏捷开发的理念已经流行了很长的时间,在敏捷开发中的开发迭代阶段中,我们可以通过五个步骤,来有效的提高整个项目的 ...
- 敏捷开发中编写高质量Java代码
原文出处:http://java.csdn.net/a/20100308/259219.html 敏捷开发的理念已经流行了很长的时间,在敏捷开发中的开发迭代阶段中,我们可以通过五个步骤,来有效的提高整 ...
- 如何在内嵌 css 中编写: hover_优秀 CSS 代码的 8 个编写技巧!
这篇文章的目的不在于规则手册,而在于你正在编写CSS时的指南.希望能帮助大家找到自己的流程,而这篇文章的目标是让你的CSS一致,简单,易于使用. 编写基本的CSS和HTML是我们作为Web开发人员学习 ...
- 在Visual Studio中编写Epicor10的BPM代码
1.搭建Visual Studio编写BPM的环境 a.共享或复制服务端Server文件 BPM是运行在Epicor服务器上的,因此编写BPM代码是需要服务端文件支持的, 所以需要把服务端Server ...
- vscode查看历史代码_VSCode中数据科学家的四大代码查看器
vscode查看历史代码 动机 (Motivation) Data science field requires working with data and files in different fo ...
- mysql存储过程中使用select count(*) into 变量名 from +表+ where条件的用法
select count(*) into v_count from dual where userid=2; 此语句的意思就是根据where条件查询dual表,得到的行数存入变量v_count中(给变 ...
- 使用Python编写淘宝抢购代码
在 Python 中编写淘宝抢购代码,需要使用一些第三方库来帮助我们登录淘宝并获取商品信息.具体步骤如下: 安装所需的第三方库.需要使用的库有:requests.selenium 和 chromedr ...
最新文章
- C语言实现易语言变量框,c语言实现简单的易语言
- shiro放行_Shiro框架详解 tagline
- 光流 | 特征光流之视频中物体检测一(论文分享)
- mysql 复制诊断_诊断Mysql复制问题
- c++实现二叉搜索树
- android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
- Node.js:入门资料
- jQuery琐碎笔记
- 转:C#调用C++的DLL搜集整理的所有数据类型转换方式
- Python 机器学习:多元线性回归
- resnet和densenet系列模型结构图可视化
- 阿里云 OSS 客户端直传 Policy 模式使用
- 批量下载中国气象科学数据共享网的数据
- 论文笔记:Meta-attention for ViT-backed Continual Learning CVPR 2022
- 微信授权登陆接入第三方App(步骤总结)Android。
- python保存的代码在哪里_Python保存程序
- 第十九章《类的加载与反射》第3节:反射
- apk包反编译,签名
- OpenCV与VS2017的安装与环境配置
- app反爬测试之apk逆向分析-frida
热门文章
- python高阶函数看不懂_Python进阶:高阶函数的详细说明
- 个人对于MySQL的理解_MySQL锁的理解
- 0018计算机基础知识,0018 0019计算机应用基础上机试题
- linux 分隔大文件,linux系统下分割大文件的方法
- 算法训练 和为T 深度搜索
- C++中指针与引用的区别
- python中表示空类型的是_python中怎么表示空值
- java gradle 资源访问_java在gradle工程访问src/test/resources目录下的资源配置文件
- 请领导批阅文件怎么说_请领导吃饭,不要对外说,职场员工为何如此保密?
- php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码