全接触SQLServer异常与孤立事务!

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

一、首先从SQLServer中Error讲起,SQL中错误处理有些怪辟错误级别同是16但结果都不同。

 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、使用现有手段解决孤立事务


   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)1
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
文章标签: sqlserver 活动 sql
个人分类: 数据库
想对作者说点什么? 我来说一句

全接触SQLServer异常孤立事务

zgqtxwd zgqtxwd

2008-04-29 05:19:00

阅读数:114

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭