【发布时间】:2015-11-23 08:46:29
【问题描述】:
我面临以下问题: 在我的项目中,我在应用程序正在使用的同一个数据库中进行了错误登录。这意味着,如果发生错误,那么在每个 catch 中,都会将错误存储到 DB 中。 然而,问题是在使用事务时。当错误发生时,tran 回滚,但它也回滚记录的错误,就像在这种情况下:
这是公共服务,用于保存客户端更改。
public UpdateClient(client)
{
try
{
TransactionScope scope0 = new TransactionScope();
// some code
scope0.Complete();
}
catch(Exception ex)
{
Logger.LogException(ex); //log the exception into DB
}
}
这是公共服务,用于多个客户端更改:
public void UpdateClients(clients)
{
try
{
TransactionScope scope1 = new TransactionScope();
foreach (client c in clients)
{
UpdateClient(c);
}
scope1.Complete();
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
这里发生的情况是,如果使用 UpdateClients(),并且如果 UpdateClient() 中发生错误,则它会在 UpdateClient() 捕获块中登录到 DB。 scope0 被回滚,并且不影响记录的异常。但是 scope1 也会被回滚,并且还会回滚存储在 DB 中的 UpdateClient() 捕获块中的异常。
我知道,有一些选项,例如将错误存储在不同的数据库中等等,但不幸的是,这在当前的开发状态下是不可接受的。 有什么办法,如何在不做大改动的情况下解决这个问题?
【问题讨论】:
-
您可以收集错误信息并在回滚后将它们插入到数据库中。
-
@RenéVogt 您能否更具体一点,如何收集它们并区分直接调用 UpdateClient() 和从 UpdateClients() 调用?
标签: c# error-handling transactions rollback transactionscope