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