SQLServer的怪辟:异常与孤立事务[1]
首先,从SQLServer中的错误开始。SQL中的错误处理有点奇怪。误差水平同为16,但结果不同。
下面是一个引用片段:
select * from a missing table
if @ @ error 0
print ' this one no output '
go
raiserror(',16,3)
if @
exec(' select * from a less table ')
if @ @ error 0
print ' this output '
go
exec sp _ execute SQL N ' select * from a seen table '
if @ @ error 0
print ' this output '
这样可以发现exec或sp_executesql执行的可疑sql,以便以后捕捉异常终止错误。
第二,导致孤立事件:
1、孤立交易的产生
以下是一段引文:
select @@trancount当前连接的活动事务数-当前连接的活动事务数为0
begin tran
如果@ @ error 0
begin
print ' not executed here!',则Select * from an缺席的表
if @ @ tran count 0 roll back tran
end
提交事务
select @@trancount当前连接的活动事务数——执行后可以看到当前连接的活动事务数为1,重复执行每次都会累加,非常消耗资源。
应该是rollback根本没有回滚。
2.利用现有手段解决孤立事务。
引用如下:
print @@trancount print '当前连接的活动事务数'-如果@ @ Tran count 0 roll back Tran-在此处写入只能保留隔离的事务,直到下次调用您的过程
begin tran。
如果@ @ error 0
begin
print ' not executed here!',则Select * from an缺席的表
if @ @ tran count 0 roll back tran
end
提交事务
-执行后可以看到当前连接的活动事务数为1,但重复执行不会累加。
Print @@trancount print '当前连接的活动事务数'
第三,使用set xact_abort控制一些违反约束的错误的执行过程。
下面是引用的片段:
create table table 1(a int check(a > 100))
go
set Xact _ abort on
begin tran
insert table 1 values(10)
Print ' not executed here '
commit tran
go
Print ' ' Print ' = = = = = = = = = = = = = = = = = = = = = = = = Xact _ abort off
go
删除表table1
但是,set xact_abort在编译错误中不起作用,它还会产生孤立的事务。
xact _ abort on
begin trans
insert a absent table values(10)
print ' not executed here '
commit trans
go
打印''打印' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = '打印''
xact _ abort off
begin trans
insert a absent table values(10)
print ' not executed here '
commit trans
go
Select @@trancount当前连接的活动事务数-如果@ @ trancount0Rollback Tran
,则有两个孤立事务
在t-sql编程中一定要注意sql中的各种奇怪错误和孤立事务。当心孤立事务的陷阱,尽最大努力避免浪费或孤立资源。微软已经公开宣布SQLServe Yukon的下一个版本将有一个内置的异常处理语法。这时候,意外的错误可以通过代码得到更好的控制。
0条评论