纯C#编码的事务

本文关键字:事务 编码 | 更新日期: 2023-09-27 18:25:31

我想知道是否有一种简单的方式来处理C#中的某种事务。假设我们有两个属性,我们希望更新它们的值。我们可以写:

A = GetA();
B = GetB();

问题是,如果在分配B时抛出异常,那么对象将处于不一致的状态,因为A已经更新。我们可以通过存储A的当前值并在处理B:时捕获异常来解决这个问题

var tempA = A;
A = GetA(); // A is up to date
try { B = GetB(); } catch { A = tempA; } // B is up to date also or A is reverted

即使是上面的解决方案也不能保存,因为在还原A时可能会引发异常,但问题是,如果.NET中有简化此类操作的内置机制?

我可以想象这样的声明:

transaction { A = GetA(); B = GetB(); }

或者代码构造,如:

Transaction.Enter();
A = GetA();
B = GetB();
Transaction.Leave();

在交易之前,机器状态将被存储,在交易之后,如果出现异常,它将被恢复。在.NET中有类似的东西吗?

纯C#编码的事务

"TransactionScope不仅仅用于数据库。每个实现IEnlistmentNotification接口的组件都可以参与事务范围的两阶段提交。

以下是事务性内存存储的示例:http://www.codeproject.com/KB/dotnet/Transactional_Repository.aspx"

来源:https://stackoverflow.com/a/2273902/1714342

我认为您可以实现这个IEnlistmentNotification接口并使用TransactionScope

您可以使用TransactionScope类。

示例:

using(var scope = new TransactionScope())
{
    DoAction1();
    DoAction2();
    scope.Complete();
}

对象事务没有内置功能。但也有一些第三方库提供了这种功能来支持对象状态管理。

你可以看看这个类似的问题。

https://stackoverflow.com/a/1765642/881798