只是好奇,是否支持普通C#对象上的事务?喜欢
using (var transaction = new ObjectTransaction(obj))
{
try
{
obj.Prop1 = value;
obj.Prop2 = value;
obj.Recalculate(); // may fire exception
transaction.Commit(); // now obj is saved
}
except
{
transaction.Rollback(); // now obj properties are restored
}
}
Run Code Online (Sandbox Code Playgroud)
只是为了让答案更有用;-)其他语言有什么相似之处吗?
STM更新:这是它声称的内容:
atomic {
x++;
y--;
throw;
}
Run Code Online (Sandbox Code Playgroud)
将保持x/y不变,包括链式方法调用.看起来像我要求的.至少它非常有趣.我认为这已足够接近了.此外,其他语言也有类似的东西,例如Haskell STM.注意我没说它应该用于生产;-)
Fra*_*ger 13
微软正在努力.阅读有关软件事务内存的信息.
他们使用一些不同的语法:
// For those who like arrows
Atomic.Do(() => {
obj.Prop1 = value;
obj.Prop2 = value;
obj.Recalculate();
});
// For others who prefer exceptions
try {
obj.Prop1 = value;
obj.Prop2 = value;
obj.Recalculate();
}
catch (AtomicMarker) {
}
// we may get this in C#:
atomic {
obj.Prop1 = value;
obj.Prop2 = value;
obj.Recalculate();
}
Run Code Online (Sandbox Code Playgroud)
对于它的价值,一个成熟的STM是一个小小的出路,我强烈建议不要滚动你自己.
幸运的是,您可以通过仔细设计类来获得所需的功能.特别是,不可变类支持开箱即用的类似事务的行为.由于每次设置属性时,不可变对象都会返回自己的新副本,因此如果需要,您始终可以进行完全历史记录更改以进行回滚.
归档时间: |
|
查看次数: |
7581 次 |
最近记录: |