【问题标题】:How to re-execute all commands in a rolled back SqlTransaction instance?如何在回滚的 SqlTransaction 实例中重新执行所有命令?
【发布时间】:2017-03-20 11:27:42
【问题描述】:

我从我的 ASP.NET 应用程序执行几个 SQL 事务。一个事务一个接一个地执行多个存储过程。交易是相当长时间运行的。

当我的应用程序的两个实例(即两个不同的进程)连接到一个数据库时,我有时会遇到 SQL 死锁问题。在这种情况下,SQL Server 会自动从任何一个进程回滚事务。

发生这种情况时,我想执行回滚的SqlTransaction 中的所有命令(存储过程)。

如何在 C# 中做到这一点?

是否有简单的方法可以重新执行 SQL 服务器回滚之前执行的 SQL 事务中的所有命令?

或者我是否必须编写自己的逻辑来“记住”(并在需要时再次执行)我执行过的所有存储过程?

【问题讨论】:

  • 您必须在用户代码中重试。所以你最后关于“自己的逻辑”的说法是正确的。

标签: c# sql .net ado.net sqltransaction


【解决方案1】:

实际上这样做是一种不好的做法,因为作为开发人员,您需要找到回滚的问题并修复它,即使这样我也会说声明一个 int 标志并在每次 sp 执行后在出现问题时递增它捕获您编写回滚的部分只需根据标志调用 sps。 再次这样做是错误的做法

【讨论】:

  • 原则上你是对的。但有时您必须编写一些这样的防御性代码,尤其是当您遇到类似 SQL 死锁的问题并且由于各种技术和非技术原因而无法在短期内进行必要的数据库级别更改时。
  • 是的,但为了避免死锁,您需要根据需要配置数据库 设置隔离级别 相应地设置锁可以避免此类情况
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多