加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:59:56 所属栏目:MsSql教程 来源:网络整理
导读:一、首先从SQLServer中Error讲起,SQL中错误处理有些怪辟 错误级别同是16但结果都不同。 ? select * from 一个不在的表 ? if @@error0 ??? print '这个没有输出' ? go ? raiserror('',16,3) ? if @@error0 ??? print '这个输出了' ? go ? exec('select * fro

一、首先从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 '当前连接的活动事务数'

三、使用 set xact_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将有内置异常处理语法。那时可以通过代码对无法预料的错误有更好的控制

(编辑:李大同)

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

    推荐文章
      热点阅读