[20131014] 出现错误,显示事务没有回滚 测试代码: try delete dbo.t try begin catch catch commit /* 问题:1.select * from [不存在的表] 为什么会直接跳出,不完成事务?2.select * from [不存在的表] 是否属于编译错误?3.修改为set xact_abort on 可以回
[20131014] 出现错误,显示事务没有回滚
测试代码:
trydelete dbo.t trybegin catch catchcommit/*问题:1.select * from [不存在的表] 为什么会直接跳出,不完成事务?2.select * from [不存在的表] 是否属于编译错误?3.修改为set xact_abort on 可以回滚,如果select * from [不存在的表]是编译错误那么联机文档中:编译错误(如语法错误)不受 set xact_abort 的影响。如何解释?*/
问题:
在一个session中运行以上代码,然后在另外一个session运行 select * from t,发现select语句被堵塞
原因:
sql 编译的流程 parse->bind->optimize->execute
一般认为从parse到optimize 是编译阶段,,execute是执行阶段
猜测try catch不会再bind和optimize阶段出现的错误进行捕获,以上出现的错误可能不被认为是编译错误,所以,使用 xact 为on是可以成功自动回滚
解决方法:
使用 set xact_abort on 来回滚事物
posted on