【发布时间】:2017-08-14 21:12:39
【问题描述】:
好的,所以我遇到了一个相当奇怪的情况。我的情况有几个层次。我还没有确定是否严格要求每一层,但这是发生了什么:
- C# 代码正在创建环境事务,
SqlConnection会自动加入其中。 - C# 代码正在使用
SqlDataAdapter向表中插入一行。 -
InsertCommand正在引用存储过程。存储过程是一个简单的INSERT语句。 - 正在执行
INSERT的表上有一个触发器INSTEAD OF INSERT。 - 触发器在表上获得排他锁。
- 触发器中出现错误。
使用此连接,C# 代码中不会引发错误。但是,如果触发器没有在表上获得排他锁,则错误确实由 C# 代码引起。
错误实际上发生了,但事实证明,在 SQL Server 端,事务已中止。 C# 代码不知道事务已被中止,只有当TransactionScope 尝试处理COMMIT TRANSACTION 时才会遇到错误。
我已经创建了这个场景的最小复制:
https://github.com/logiclrd/TestErrorWhileLockedInTrigger
有没有人知道为什么会这样,以及如何恢复正确的错误处理行为?
【问题讨论】:
-
任何看过这个并被
Database Initialization.sql和代码之间的不匹配搞糊涂的人,那是我的错。在添加和提交到 git 之前,我忘了打Save。我已经使用正确的初始化代码进行了后续提交。
标签: c# sql-server error-handling transactions transactionscope