2017-03-20 28 views
0

我从我的ASP.NET应用程序执行几个SQL事务。一个事务一个接一个地执行几个存储过程。交易是相当长的运行。如何在一个回滚的SqlTransaction实例中重新执行所有的命令?

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

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

如何在C#中执行此操作?

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

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

+3

你必须在用户代码重试。所以你最后关于“自己的逻辑”的陈述是正确的。 –

回答

1

其实它是一个不好的做法,因为作为一个开发人员,你需要找到什么是回滚和修复的问题,即使如此,我会说声明一个int标志,并且在每次sp执行后增加它,当出现错误时在你写回滚的catch节中,根据标志调用sps。 这又是一个错误的做法

+1

原则上,你是对的。但是有时你必须编写一些像这样的防御性代码,特别是当你遇到像问题那样的SQL死锁时,由于各种技术和非技术原因,不能很快进行必要的数据库级别更改。 – Learner

+0

是的,这是真的,但为了避免死锁,您需要配置您的数据库与您的需要设置隔离级别相应地设置锁可能会避免像这样的情况 –

相关问题