加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server编写事务解决有几种方法,写法是什么

发布时间:2023-04-25 13:48:20 所属栏目:MsSql教程 来源:
导读:这篇文章给大家分享的是SQL Server编写事务处理有几种方法,写法是什么。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看
这篇文章给大家分享的是SQL Server编写事务处理有几种方法,写法是什么。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
 
本文实例讲述了SQL Server存储过程中编写事务处理的方法。分享给大家供大家参考,具体如下:
 
SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。
 
在编写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
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章