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
投稿

猜你喜欢

  • 好友列表利用率越高,社区越失败

    2008-04-10 12:22:00
  • Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现方法

    2021-12-30 00:21:40
  • JS+HTML实现的圆形可点击区域示例【3种方法】

    2024-04-10 10:42:30
  • Go并发编程中sync/errGroup的使用

    2024-02-05 04:40:56
  • 详解Python+Matplotlib绘制面积图&热力图

    2021-10-10 10:16:29
  • ip地址和身份证的js验证代码

    2007-12-29 21:49:00
  • Win10下Python环境搭建与配置教程

    2023-08-24 03:25:18
  • python小程序之飘落的银杏

    2023-05-25 02:58:31
  • Python asyncio的一个坑

    2022-04-06 20:58:28
  • Typecho插件实现添加文章目录的方法详解

    2023-05-25 07:19:04
  • python读文件逐行处理的示例代码分享

    2023-03-17 03:54:04
  • BootStrap点击下拉菜单项后显示一个新的输入框实现代码

    2024-04-16 08:54:39
  • JavaScript使用HTML5的window.postMessage实现跨域通信例子

    2024-04-10 11:00:41
  • 关于Python 位运算防坑指南

    2022-06-13 08:06:55
  • Mysql主键和唯一键的区别点总结

    2024-01-15 10:36:36
  • Python中self用法实例详解

    2022-12-18 08:27:48
  • MySql常用命令总结

    2009-09-16 10:51:00
  • vue3中7种路由守卫的使用大全举例

    2024-05-29 22:43:52
  • FSO组件之驱动器操作asp源码

    2010-05-03 10:59:00
  • Python进程管理神器Supervisor详解

    2023-01-19 00:57:19
  • asp之家 网络编程 m.aspxhome.com