【问题标题】:An error has occurred that has caused the transaction to be classified as an uncommittable transaction发生错误,导致事务被归类为不可提交事务
【发布时间】:2016-06-01 03:49:14
【问题描述】:
XACT_STATE() 可以有 1、0、-1 值。当它为 1 时,可以执行任何操作,但当它为 -1 时,只能执行读取或回滚。在哪种情况下事务被归类为不可提交事务。
Here 是 msdn 所说的。
当前请求有一个活跃的用户事务,但是有一个错误
发生导致该交易被归类为
不可提交的交易。请求无法提交事务
或回滚到保存点;它只能请求完全回滚
交易。请求不能执行任何写操作,直到
它回滚事务。该请求只能执行读取
操作,直到它回滚事务。交易后
已经回滚,请求可以读写
操作并可以开始新事务。
【问题讨论】:
标签:
sql-server
tsql
transactions
try-catch
【解决方案1】:
取自blog:
当您的交易达到 16 级错误时,交易可能会进入注定失败的状态 (XACT_STATE() =-1),尽管并非总是如上文所述!!
以下是博客中给出的一些示例:
--datatype conversion errors:
DECLARE @GUID UNIQUEIDENTIFIER
SELECT @GUID = CONVERT(UNIQUEIDENTIFIER, 'ABC')
---divide by zero errors:
SELECT * FROM my_books WHERE Isbn/0 = 2
--dropping column which doesnt exists
ALTER TABLE my_books DROP COLUMN author;
作者还在下面解释了可能导致交易失败的其他错误级别..
可能会有更多的错误导致交易进入注定失败的状态! 用户可以将此博客作为参考,以确定严重级别为 16 的错误是否会回滚事务。如果您愿意,您还可以测试其他严重性或级别的错误
还有一个link,这将有助于模拟每个错误级别..