在 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

在存储过程中编写正确的事务处理代码相关推荐

  1. SQL Server在存储过程中编写事务处理代码的三种方法

    SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...

  2. 如何在Java中编写正确的微基准测试?

    您如何用Java编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,以说明要考虑的各种问题. 示例:基准测试应测量时间/迭代或迭代/时间,为什么? 相关: 秒表基准测试是否可以接受? #1 ...

  3. [转]敏捷开发中编写高质量Java代码

    本文转自:http://dev.yesky.com/103/11164603.shtml 敏捷开发的理念已经流行了很长的时间,在敏捷开发中的开发迭代阶段中,我们可以通过五个步骤,来有效的提高整个项目的 ...

  4. 敏捷开发中编写高质量Java代码

    原文出处:http://java.csdn.net/a/20100308/259219.html 敏捷开发的理念已经流行了很长的时间,在敏捷开发中的开发迭代阶段中,我们可以通过五个步骤,来有效的提高整 ...

  5. 如何在内嵌 css 中编写: hover_优秀 CSS 代码的 8 个编写技巧!

    这篇文章的目的不在于规则手册,而在于你正在编写CSS时的指南.希望能帮助大家找到自己的流程,而这篇文章的目标是让你的CSS一致,简单,易于使用. 编写基本的CSS和HTML是我们作为Web开发人员学习 ...

  6. 在Visual Studio中编写Epicor10的BPM代码

    1.搭建Visual Studio编写BPM的环境 a.共享或复制服务端Server文件 BPM是运行在Epicor服务器上的,因此编写BPM代码是需要服务端文件支持的, 所以需要把服务端Server ...

  7. vscode查看历史代码_VSCode中数据科学家的四大代码查看器

    vscode查看历史代码 动机 (Motivation) Data science field requires working with data and files in different fo ...

  8. mysql存储过程中使用select count(*) into 变量名 from +表+ where条件的用法

    select count(*) into v_count from dual where userid=2; 此语句的意思就是根据where条件查询dual表,得到的行数存入变量v_count中(给变 ...

  9. 使用Python编写淘宝抢购代码

    在 Python 中编写淘宝抢购代码,需要使用一些第三方库来帮助我们登录淘宝并获取商品信息.具体步骤如下: 安装所需的第三方库.需要使用的库有:requests.selenium 和 chromedr ...

最新文章

  1. C语言实现易语言变量框,c语言实现简单的易语言
  2. shiro放行_Shiro框架详解 tagline
  3. 光流 | 特征光流之视频中物体检测一(论文分享)
  4. mysql 复制诊断_诊断Mysql复制问题
  5. c++实现二叉搜索树
  6. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
  7. Node.js:入门资料
  8. jQuery琐碎笔记
  9. 转:C#调用C++的DLL搜集整理的所有数据类型转换方式
  10. Python 机器学习:多元线性回归
  11. resnet和densenet系列模型结构图可视化
  12. 阿里云 OSS 客户端直传 Policy 模式使用
  13. 批量下载中国气象科学数据共享网的数据
  14. 论文笔记:Meta-attention for ViT-backed Continual Learning CVPR 2022
  15. 微信授权登陆接入第三方App(步骤总结)Android。
  16. python保存的代码在哪里_Python保存程序
  17. 第十九章《类的加载与反射》第3节:反射
  18. apk包反编译,签名
  19. OpenCV与VS2017的安装与环境配置
  20. app反爬测试之apk逆向分析-frida

热门文章

  1. python高阶函数看不懂_Python进阶:高阶函数的详细说明
  2. 个人对于MySQL的理解_MySQL锁的理解
  3. 0018计算机基础知识,0018 0019计算机应用基础上机试题
  4. linux 分隔大文件,linux系统下分割大文件的方法
  5. 算法训练 和为T 深度搜索
  6. C++中指针与引用的区别
  7. python中表示空类型的是_python中怎么表示空值
  8. java gradle 资源访问_java在gradle工程访问src/test/resources目录下的资源配置文件
  9. 请领导批阅文件怎么说_请领导吃饭,不要对外说,职场员工为何如此保密?
  10. php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码