博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
阅读量:5008 次
发布时间:2019-06-12

本文共 1907 字,大约阅读时间需要 6 分钟。

在编写 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 ...   end try   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

 

posted on
2012-03-23 01:07 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/jiangyuxuan/archive/2012/03/23/2413037.html

你可能感兴趣的文章
Selenium 入门到精通系列:六
查看>>
要闻:2016胡润百富榜昨天发布 宝能姚振华从炸油条到千亿身家“大黑马”
查看>>
android ADT 安装 很慢 并出错
查看>>
HTTP与TCP的区别和联系
查看>>
android 实现2张图片层叠效果
查看>>
我个人所有的独立博客wordpress都被挂马
查看>>
html5——动画案例(时钟)
查看>>
调用Android系统“应用程序信息(Application Info)”界面
查看>>
ios中用drawRect方法绘图的时候设置颜色
查看>>
Django 基于session认证 小作业
查看>>
数据库中的外键和主键理解
查看>>
个人博客03
查看>>
Expression<Func<T,TResult>>和Func<T,TResult>
查看>>
文件缓存
查看>>
关于C语言中return的一些总结
查看>>
Codeforces Round #278 (Div. 2)
查看>>
51. N-Queens
查看>>
Linux 命令 - 文件搜索命令 locate
查看>>
CTFMON。exe
查看>>
spark
查看>>