[英]software transactions in c#
我有一些C#代码需要像这样工作
D d = new D();
foreach(C item in list)
{
c.value++;
d.Add(c); // c.value must be incremented at this point
}
if(!d.Process())
foreach(C item in list)
c.value--;
它增加列表中每个项目的值,然后尝试对它们进行一些处理。 如果处理失败,则需要屏蔽突变或项目。
问题是: 是否有更好的方法可以做到这一点? 我对此不喜欢的事情是,我可能会发现它出了问题的方法。 例如,如果发生任何事情,它就会失去同步。
一个想法(似乎比问题还糟)是:
D d = new D();
var done = new List<C>();
try
{
foreach(C item in list)
{
c.value++;
done.Add(c);
d.Add(c);
}
if(d.Process()) done.Clear();
}
finaly
{
foreach(C c in done)
c.value--;
}
在不了解您的应用程序的全部细节的情况下,我认为不可能为您提供针对该问题的具体解决方案。 基本上,没有一种方法可以始终在您需要这种情况的100%的情况下工作。
但是,如果您控制着D
类,并且知道D.Process()
将会失败的情况,则您可以执行以下两项操作之一,这将在概念上D.Process()
此操作。
一种方法是在调用Process
方法之前,通过实现CanProcess
函数之类的东西来测试D
的状态,该函数在且仅当Process
会返回true时才返回true,但实际上并未进行任何处理。
另一种方法是创建一个临时的D
对象,该对象实际上并未提交,但在其内容上运行Process
方法。 然后,如果Process
成功,您可以在其上调用某种Promote
或Commit
方法来完成更改。 与拥有Dataset
对象类似,可以创建它的克隆,在克隆中进行事务处理,然后仅在处理成功时才将其合并回主数据集中。
它占用大量内存,但是您可以在递增之前复制列表。 如果该过程成功,则可以返回新列表。 如果失败,则返回原始列表。
为什么不仅在过程成功时才增加?
我认为更好的方法是使D中的处理方法增加内部的c.value。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.