gpt4 book ai didi

c# - 使用 SqlDataAdapter 和环境事务锁定表丢失的触发器中的 SQL Server 错误

转载 作者:行者123 更新时间:2023-11-30 17:34:07 24 4
gpt4 key购买 nike

好吧,我遇到了一个相当奇怪的情况。我的情况有好几层。我还没有确定是否严格要求每一层,但这是正在发生的事情:

  • C# 代码正在创建一个环境事务,SqlConnection 会自动加入其中。
  • C# 代码使用 SqlDataAdapter 向表中插入一行。
  • InsertCommand 正在引用一个存储过程。存储过程是一个简单的 INSERT 语句。
  • 执行INSERT 的表有一个触发器INSTEAD OF INSERT
  • 触发器获得表的独占锁。
  • 触发器内发生错误。

使用此结合,不会在 C# 代码中引发错误。但是,如果触发器没有获得表上的独占锁,C# 代码就会出错。

错误,但是,在 SQL Server 端,事务已中止这一事实证明了这一点。 C# 代码不知道事务已中止,仅当 TransactionScope 的处理尝试 COMMIT TRANSACTION 时才会遇到错误。

我创建了这个场景的最小复制:

https://github.com/logiclrd/TestErrorWhileLockedInTrigger

有没有人知道为什么会这样,以及如何恢复正确的错误处理行为?

最佳答案

所以,我对此做了更多测试。

我的第一个想法是,如果持有独占锁导致它压制错误,也许显式释放锁会解除压制?因此,我在概念验证中生成错误的语句周围放置了一个TRY/CATCH,让它ROLLBACK TRANSACTION然后重新THROW,但它什么也没做。

然后我的下一个想法是,RAISERROR 语句在严重级别为 20-25 时会强制终止连接。我不确定这是否是一个理想的解决方案,因为它还会在发生这种情况时向 SQL Server 事件日志中写入一个条目。但是,它确实实现了让 SqlDataAdapter 在其 Update 命令期间看到错误的目标,而不是 C# 代码认为事务仍处于事件状态并尝试提交它。

有没有人知道这种“大锤”方法的其他潜在缺点,或者它是否可能是在这种情况下正确传播错误的唯一方法?

关于c# - 使用 SqlDataAdapter 和环境事务锁定表丢失的触发器中的 SQL Server 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42957010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com