全接触SQLServer异常与孤立事务!
一、首先从SQLServer中Error讲起,SQL中错误处理有些怪辟 错误级别同是16但结果都不同。 ? select * from 一个不在的表 ? raiserror('',16,3) ? exec('select * from 一个不在的表') ? exec sp_executesql N'select * from 一个不在的表' 这样你可以发现通过exec或sp_executesql执行可疑的sql,这样就可以在后面捕捉到被异常终止的错误。
??? select @@trancount 当前连接的活动事务数 --当前连接的活动事务数为0 ??? begin tran ??? select * from 一个不在的表 ??? commit tran ??? select @@trancount 当前连接的活动事务数? --执行后你看看 当前连接的活动事务数为1,且重复执行会每次累加,这是很耗资源的。 ? 应为rollback根本就没有被回滚。 ? 2、使用现有手段解决孤立事务
??? if @@trancount<>0 rollback tran --在这里写可以让孤立事务只保持到下次你的过程被调用 ??? select * from 一个不在的表 ??? commit tran ??? ---执行后你看看 当前连接的活动事务数为1,但重复执行不会累加 三、使用 set xact_abort 来控制部分违反约束的错误的执行过程 ? create table Table1 (a int check(a>100)) ? set xact_abort on ? go 但 set xact_abort 对于编译产生的错误确没有起作用,且同样会产生孤立事务 ? set xact_abort on ? print '' print '==============================================' print '' ? set xact_abort off ? select @@trancount 当前连接的活动事务数 ---有两个孤立事务
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql – ROW_NUMBER()不够快有大结果集,有什么好的解决方案吗
- 装SQLServer遇到的错误Error:2147749907,Error:214774989
- SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除
- sqlserver2005 机器间的数据库迁移
- sqlserver中distinct的用法(不重复的记录)
- mysql中多表删除其中ID相同记录的方法
- sql-server – 标识列上的索引是否应该是非聚簇的?
- sqlserver行号Row_number不用order by
- SQL Server和Oracle的EF和TransactionScope没有升级/跨越到
- sql – 实现标记的方法 – 各自的优点和缺点