全接触sqlserver异常与孤立事务
时间:2007-12-23 来源:不详 作者:迈克DB
select*from一个不在的表
if@@error<>0
print’’这个没有输出’’
go
raiserror(’’’’,16,3)
if@@error<>0
print’’这个输出了’’
go
exec(’’select*from一个不在的表’’)
if@@error<>0
print’’这个输出了’’
go
execsp_executesqln’’select*from一个不在的表’’
if@@error<>0
print’’这个输出了’’
这样你可以发现通过exec或sp_executesql执行可疑的sql,这样就可以在后面捕捉到被异常终止的错误。
二、引出孤立事务:
1、孤立事务的产生
select@@trancount当前连接的活动事务数--当前连接的活动事务数为0
begintran
select*from一个不在的表
if@@error<>0
begin
print’’没有执行到这里来!’’
if@@trancount<>0rollbacktran
end
committran
select@@trancount当前连接的活动事务数--执行后你看看当前连接的活动事务数为1,且重复执行会每次累加,这是很耗资源的。
应为rollback根本就没有被回滚。
2、使用现有手段解决孤立事务 内容来自dedecms
print@@trancountprint’’当前连接的活动事务数’’--当前连接的活动事务数为0
if@@trancount<>0rollbacktran--在这里写可以让孤立事务只保持到下次你的过程被调用
begintran
select*from一个不在的表
if@@error<>0
begin
print’’没有执行到这里来!’’
if@@trancount<>0rollbacktran
end
committran
---执行后你看看当前连接的活动事务数为1,但重复执行不会累加
print@@trancountprint’’当前连接的活动事务数’’
三、使用setxact_abort来控制部分违反约束的错误的执行过程
createtabletable1(aintcheck(a>100))
go
setxact_aborton
begintran
inserttable1values(10)
print’’这里没有被执行’’
committran
go
print’’’’print’’==============================================’’print’’’’
setxact_abortoff
begintran
inserttable1values(10)
print’’这里被执行’’
committran
go
droptabletable1
但setxact_abort对于编译产生的错误确没有起作用,且同样会产生孤立事务
setxact_aborton
begintran
insert一个不在的表values(10) 织梦内容管理系统
print’’这里没有被执行’’
committran
go
print’’’’print’’==============================================’’print’’’’
setxact_abortoff
begintran
insert一个不在的表values(10)
print’’这里没有被执行’’
committran
go
select@@trancount当前连接的活动事务数---有两个孤立事务
if@@trancount<>0rollbacktran

上一篇:理解odbc和ole 下一篇:Windows环境中Kill掉Oracle线程
文章评论
共有位Admini5网友发表了评论 查看完整内容