C# 如何在回滚的SqlTransaction实例中重新执行所有命令?

C# 如何在回滚的SqlTransaction实例中重新执行所有命令?,c#,sql,.net,ado.net,sqltransaction,C#,Sql,.net,Ado.net,Sqltransaction,我从ASP.NET应用程序执行了几个SQL事务。一个事务一个接一个地执行多个存储过程。事务是相当长时间运行的事务 当我的应用程序的两个实例(即两个不同的进程)连接到一个数据库时,我有时会遇到SQL死锁问题。在这种情况下,SQL server会自动从任何一个进程回滚事务 发生这种情况时,我希望执行回滚的SqlTransaction中的所有命令(存储过程) 我怎样才能在C#中做到这一点 是否有简单的方法重新执行SQL事务中的所有命令,这些命令是在SQL server回滚事务之前执行的 或者我必须写自

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

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

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

我怎样才能在C#中做到这一点

是否有简单的方法重新执行SQL事务中的所有命令,这些命令是在SQL server回滚事务之前执行的


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

实际上这样做是一种不好的做法,因为作为一个开发人员,您需要找到回滚的问题所在,并解决这个问题,即使如此,我还是会说在每次sp执行后声明一个int标志,并在编写回滚的catch部分出错时增加它,只需调用sp即可根据国旗。
同样,这样做是错误的

您必须在用户代码中重试。所以你最后关于“自己的逻辑”的陈述是正确的。原则上,你是正确的。但是有时候你不得不写一些像这样的防御代码,特别是当您遇到类似SQL死锁的问题,并且由于各种技术和非技术原因,您无法在短时间内进行必要的数据库级别更改时。是的,这是正确的,但为了避免死锁,您需要根据需要配置数据库设置隔离级别相应地设置锁可能会避免此类情况