C#对象的事务?

que*_*en3 20 c#

只是好奇,是否支持普通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与共享状态和并发性没有多大关系吗? (2认同)

Jul*_*iet 5

对于它的价值,一个成熟的STM是一个小小的出路,我强烈建议不要滚动你自己.

幸运的是,您可以通过仔细设计类来获得所需的功能.特别是,不可变类支持开箱即用的类似事务的行为.由于每次设置属性时,不可变对象都会返回自己的新副本,因此如果需要,您始终可以进行完全历史记录更改以进行回滚.