gpt4 book ai didi

c# transactionscope 只需要回滚一些更改

转载 作者:行者123 更新时间:2023-12-03 08:53:36 27 4
gpt4 key购买 nike

我面临以下问题:
在我的项目中,我在应用程序正在使用的同一个数据库中进行了错误登录。这意味着,如果发生错误,那么在每个 catch 中,都会将错误存储到 DB 中。
然而,问题是在使用事务时。发生错误时,tran 回滚,但它也会回滚记录的错误,就像在这种情况下一样:

这是公共(public)服务,用于保存客户端更改。

public UpdateClient(client)
{
try
{
TransactionScope scope0 = new TransactionScope();

// some code

scope0.Complete();
}
catch(Exception ex)
{
Logger.LogException(ex); //log the exception into DB
}
}

这是公共(public)服务,用于多个客户端更改:
 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() 捕获 block 中登录到 DB。 scope0 被回滚,并且不影响记录的异常。但是 scope1 也被回滚,并且还将回滚存储在 DB 中的 UpdateClient() 捕获 block 中的异常。

我知道,有一些选项,比如将错误存储在不同的数据库中等等,但不幸的是,这在当前的开发状态下是 Not Acceptable 。
有什么办法,如何在不进行重大更改的情况下解决这个问题?

最佳答案

您可以在更新时收集异常并将它们插入到事务范围之外的数据库中:

public UpdateClient(client, bool logErrors = true)
{
try
{
TransactionScope scope0 = new TransactionScope();

// some code

scope0.Complete();
}
catch(Exception ex)
{
Logger.EnlistException(ex); // collect the exception
}
if (logErrors) Logger.WriteEnlistedExceptions();
}

public void UpdateClients(clients)
{
try
{
TransactionScope scope1 = new TransactionScope();
foreach (client c in clients)
{
UpdateClient(c, false);
}
scope1.Complete();
}
catch (Exception ex)
{
Logger.EnlistException(ex);
}
Logger.WriteEnlistedExceptions();
}

public partial class Logger
{
private static List<Exception> _exceptionList = new List<Exception>();
public static void EnlistException(Exception ex)
{
_exceptionList.Add(ex);
}
public static void WriteEnlistedExceptions()
{
foreach(Exception ex in _exceptionList)
LogException(ex);
_exceptionList.Clear();
}
}

这当然还不是线程安全的。来自 UpdateClient 的调用之间的区别或 UpdateClients可以通过异常的堆栈跟踪来进行。

正如 Micky 所链接的问题的答案所示,没有办法阻止外部范围的回滚。

[编辑] 添加 logErrors 标志

关于c# transactionscope 只需要回滚一些更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33866768/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com