纯C#编码中的事务

时间:2013-07-29 12:55:41

标签: c# .net

我想知道是否有一种简单的方式来处理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中有类似的东西吗?

3 个答案:

答案 0 :(得分:10)

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

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

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

我认为您可以实现此IEnlistmentNotification界面并使用TransactionScope

答案 1 :(得分:4)

您可以使用TransactionScope类。

示例:

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

    scope.Complete();
}

答案 2 :(得分:2)

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

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

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