是否可以在Graph Engine中实现事务?
我喜欢在不同的单元格上进行多次更新,然后提交或回滚这些更改。
即使有一个细胞也很难。当我使用下一个代码时,修改不会写入磁盘,但内存已更改!
using (Character_Accessor characterAccessor = Global.LocalStorage.UseCharacter(cellId, CellAccessOptions.StrongLogAhead))
{
characterAccessor.Name = "Modified";
throw new Exception("Test exception");
}
答案 0 :(得分:0)
我的理解是:无论您是否抛出此异常:更改始终只在内存中 - 直到您明确调用Global.LocalStorage.SaveStorage()
。
您可以在启动事务之前保存存储来实现事务,然后进行更改,如果要回滚,只需调用Global.LocalStorage.ResetStorage()
即可。
所有这些,当然,只有当您不需要高性能吞吐量并在单个线程上访问数据库时。
答案 1 :(得分:0)
预写日志仅在"使用"结束时刷新到磁盘。 scope - 当处理访问者并且即将释放内存存储器中的锁时。
这就像单个单元格上的迷你交易。当你拿着锁时,其他人无法进入牢房。您可以对单元格进行多项更改,并且" commit"它们最后 - 或者,在使用范围的开头制作阴影副本,然后在出现任何问题时稍后回滚到此副本(尽管这仍然是手动过程)。
另外,请检查一下:https://github.com/Microsoft/GraphEngine/tree/multi_cell_lock 我们正在努力使一个线程能够持有多个锁。这将使多实体事务更容易实现。