我有一些在简单的TransactionScope中执行的业务逻辑:
using (var scope = new TransactionScope())
{
// does some logic.
// then some more...
scope.Complete();
}
在执行期间,会发生ADO异常,并且事务正在处理它。
同时在上游进一步捕获异常,我尝试通过另一个连接将其记录到我的数据库。
此时我收到另一个错误The operation is not valid for the state of the transaction.
Eeek!
现在我可以看到我能够使用IsolationLevel来改变我的交易交互方式,但这是正确的做法吗?我应该使用哪个?
答案 0 :(得分:1)
由于您提到了多个连接,并且您所指的错误是我在DTC事务中看到的,我猜您正在运行DTC,并且由于AdoException,事务的状态出现故障。尝试在日志记录代码周围添加“RequiresNew”事务范围或发布更多代码,很难从这个小代码段中看到您的体系结构。
看看这个答案,显示两个连接如何导致DTC根据您运行的sql server版本启动: TransactionScope automatically escalating to MSDTC on some machines?
答案 1 :(得分:1)
由于正在回滚/处理事务而发生问题,我会看到两个选项:使用新事务或根本不记录任何事务。我可能会选择第二个选项并在没有交易的情况下登录。
您可以将TransactionScopeOption类型的参数传递给TransactionScope
constructor以禁止日志记录语句的事务,如下所示:
using (var scope = new TransactionScope(TransactionScopeOption.Suppress)
{
// .. log here
}
登录新的交易通行证TransactionScopeOption.RequiresNew
。
答案 2 :(得分:0)
您不能在事务范围内打开两个连接。关闭第一个连接,然后打开连接以在db中记录错误。 看看这个"The operation is not valid for the state of the transaction" error and transaction scope