SQL Server的怪辟:异常与孤立事务

来源:asp之家 时间:2009-09-24 14:11:00 

一、首先从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
  exec sp_executesql N'select * from 一个不在的表'
  if @@error<>0
  print '这个输出了'


这样你可以发现通过exec或sp_executesql执行可疑的sql,这样就可以在后面捕捉到被异常终止的错误。

二、引出孤立事务:

1、孤立事务的产生

  select @@trancount 当前连接的活动事务数 --当前连接的活动事务数为0
  begin tran
  select * from 一个不在的表
  if @@error<>0
  begin
  print '没有执行到这里来!'
  if @@trancount<>0 rollback tran
  end
  commit tran


select @@trancount 当前连接的活动事务数 --执行后你看看 当前连接的活动事务数为1,且重复执行会每次累加,这是很耗资源的。

应为rollback根本就没有被回滚。

2、使用现有手段解决孤立事务

print @@trancount print '当前连接的活动事务数' --当前连接的活动事务数为0
  if @@trancount<>0 rollback tran --在这里写可以让孤立事务只保持到下次你的过程被调用
  begin tran
  select * from 一个不在的表
  if @@error<>0
  begin
  print '没有执行到这里来!'
  if @@trancount<>0 rollback tran
  end
  commit tran
  ---执行后你看看 当前连接的活动事务数为1,但重复执行不会累加
  print @@trancount print '当前连接的活动事务数'


三、使用setxact_abort 来控制部分违反约束的错误的执行过程

  create table Table1 (a int check(a>100))
  go
  set xact_abort on
  begin tran
  insert table1 values(10)
  print '这里没有被执行'
  commit tran
  go
  print '' print '==============================================' print ''
  set xact_abort off
  begin tran
  insert table1 values(10)
  print '这里被执行'
  commit tran
  go
  drop table table1
  但 set xact_abort 对于编译产生的错误确没有起作用,且同样会产生孤立事务
  set xact_abort on
  begin tran
  insert 一个不在的表 values(10)
  print '这里没有被执行'
  commit tran
  go
  print '' print '==============================================' print ''
  set xact_abort off
  begin tran
  insert 一个不在的表 values(10)
  print '这里没有被执行'
  commit tran
  go
  select @@trancount 当前连接的活动事务数 ---有两个孤立事务
  if @@trancount<>0 rollback tran


对于sql中怪辟的各种错误,和孤立事务在t-sql编程中一定要注意,小心孤立事务的陷阱,尽量避免浪费或孤立资源,Microsoft公开宣布过SQLServe下一版本Yukon将有内置异常处理语法。那时可以通过代码对无法预料的错误有更好的控制。

标签:SQLServer,异常,错误
0
投稿

猜你喜欢

  • 基于SQL Server的C/S数据库应用系统

    2009-01-21 14:44:00
  • Excel和Access之间的数据交换

    2008-11-20 16:53:00
  • 作符合用户体验的input输入框

    2008-01-10 12:21:00
  • asp如何让用户也能修改密码?

    2010-05-13 16:41:00
  • 他们是如何不让我的Teleport和Webzip工作的?

    2010-07-14 21:06:00
  • 格式化数字ASP,PHP版

    2009-01-19 14:17:00
  • MySQL数据库中应当如何实施info()函数

    2008-11-27 15:04:00
  • asp 删除数据库记录的代码

    2011-02-05 10:39:00
  • 跨平台、多浏览器页面测试

    2008-06-24 11:54:00
  • SQL Server 2005 Express版企业管理器下载

    2009-10-06 14:54:00
  • 轻设计,让网站灵敏轻便的6个技巧

    2009-12-07 21:26:00
  • PHP生成饼图的示例代码

    2023-05-25 10:24:09
  • 配置SQL Server 2000选项

    2010-04-25 11:01:00
  • PHP获取特殊时间戳的方法整理

    2023-05-25 00:47:36
  • JavaScript实现带自动提示的文本框效果代码

    2011-02-05 11:13:00
  • Oracle SQL性能优化系列学习三

    2010-07-23 13:08:00
  • JavaScript的陷阱

    2008-10-28 19:52:00
  • FrontPage XP设计制作网页小技巧八则

    2008-06-04 12:43:00
  • 为WordPress增加微博功能

    2010-08-31 15:01:00
  • 立足于传统行业设计

    2008-07-26 12:36:00
  • asp之家 网络编程 m.aspxhome.com