SQLServer:存储过程中编写事务处理的方法小结

/**8.SQLServer存储过程中编写事务处理的方法小结**/

芒市网站建设公司成都创新互联,芒市网站设计制作,有大型网站制作公司丰富经验。已为芒市超过千家提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的芒市做网站的公司定做!

原文出处:http://www.jb51.net/article/80636.htm

本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。

1.常见写法:

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

begin tran

update statement 1 ...

update statement 2 ...

delete statement 3 ...

commit tran

 

2.存在的问题/隐患:

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

create table demo(id int notnull)

go

begin tran

insert into demo values (null)

insert into demo values (2)

commit tran

go

3.如何避免这样的问题呢?有三种方法:

方法1.在事务语句最前面加上set xact_abort on;当xact_abort选项为on时,SQLServer在遇到错误时会终止执行并rollback整个事务。

setxact_abort on

begintran

updatestatement 1 ...

updatestatement 2 ...

deletestatement 3 ...

committran

go

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

begintran

updatestatement 1 ...

if @@error <>0

beginrollbacktran

gotolabend

end

deletestatement 2 ...

if @@error <> 0

beginrollbacktran

gotolabend

end

committran

labend:

go

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

begintran

begintry

updatestatement 1 ...

deletestatement 2 ...

endtry

begincatch

if @@trancount >0

rollbacktran

endcatch

if @@trancount >0

committran

go

 

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

--set nocount on 表示不返回计数

create procedure dbo.pr_tran_inprocas 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

 

执行:

Exec dbo.pr_tran_inproc


标题名称:SQLServer:存储过程中编写事务处理的方法小结
文章路径:http://scyanting.com/article/ghdjsc.html