出现错误,显示事务没有回滚解决
测试代码:
SET XACT_ABORT OFF
go
BEGIN TRAN
BEGIN TRY
DELETE dbo.T
SELECT * FROM [不存在的表] -- 事务还在,T表被锁
--SELECT 1/0 --跳到Catch中 回滚
PRINT '11'
END TRY
BEGIN CATCH
PRINT 'ROLLBACK'
SELECT @@ERROR
ROLLBACK
END CATCH
COMMIT
/*问题:
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 来回滚事物