3 回答
TA贡献1853条经验 获得超6个赞
保罗·兰德尔的文章 误差266 触发回滚
解释:
所有TXN开始和提交/回滚必须配对,以便 @@TRANCOUNT
在出入境时是相同的。 不匹配 @@TRANCOUNT
导致错误266,因为 BEGIN TRAN
增量 @@TRANCOUNT
COMMIT
减量 @@TRANCOUNT
ROLLBACK
回报 @@TRANCOUNT
降至零 你不能减少 @@TRANCOUNT
适用于当前范围 这就是你认为的“内部交易” SET XACT_ABORT ON
取消由不匹配引起的错误266。 @@TRANCOUNT
也处理像这样的问题 “SQLServer事务超时” 日照 这允许客户端txns(如LINQ),单个存储过程可能是分布式或XA事务的一部分,或者仅仅是在客户端代码(比如.NET TransactionScope)中启动的一个存储过程。
用法:
每个存储的proc必须符合相同的模板。
摘要
所以不要创建比你需要的更多的txn
密码
CREATE PROCEDURE [Name]ASSET XACT_ABORT, NOCOUNT ONDECLARE @starttrancount intBEGIN TRY SELECT @starttrancount = @@TRANCOUNT IF @starttrancount = 0 BEGIN TRANSACTION [...Perform work, call nested procedures...] IF @starttrancount = 0 COMMIT TRANSACTIONEND TRYBEGIN CATCH IF XACT_STATE() <> 0 AND @starttrancount = 0 ROLLBACK TRANSACTION; THROW; --before SQL Server 2012 use --RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]END CATCH GO
注:
回滚检查实际上是多余的,因为 SET XACT_ABORT ON
..然而,它让我感觉更好,看上去很奇怪没有,并考虑到一些情况下,你不想要它。
TA贡献1780条经验 获得超1个赞
为了解决返回@AlexKuznetsov所提到的错误号和行号的问题,可以这样引发错误:
DECLARE @ErrorMessage NVARCHAR(4000)
DECLARE @ErrorSeverity INT
DECLARE @ErrorState INT
DECLARE @ErrorLine INT
DECLARE @ErrorNumber INT
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorNumber = ERROR_NUMBER(),
@ErrorLine = ERROR_LINE()
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber, @ErrorLine)
- 3 回答
- 0 关注
- 463 浏览
添加回答
举报