2

是否可以在 Graph Engine 中实现事务?

我喜欢在不同的单元格上进行多次更新,然后提交或回滚这些更改。

即使只有一个细胞也很困难。当我使用下一个代码时,修改不会写入磁盘,而是更改了内存!

using (Character_Accessor characterAccessor = Global.LocalStorage.UseCharacter(cellId, CellAccessOptions.StrongLogAhead))
{
    characterAccessor.Name = "Modified";
    throw new Exception("Test exception");
}
4

2 回答 2

1

预写日志仅在“使用”范围的末尾刷新到磁盘——当访问器被释放并且内存存储中的锁即将被释放时。

这就像单个单元格上的小型交易。当您持有锁时,其他人无法访问该单元。您可以对单元格进行多项更改并在最后“提交”它们 - 或者,在使用范围的开头制作卷影副本,然后在出现任何问题时回滚到该副本(这仍然是一个手动过程尽管)。

另外,请查看:https ://github.com/Microsoft/GraphEngine/tree/multi_cell_lock 我们正在努力使一个线程能够持有多个锁。这将使多实体交易更容易实现。

于 2017-05-09T14:04:39.963 回答
1

我的理解是:无论您是否抛出此异常:更改始终仅在内存中-直到您明确调用Global.LocalStorage.SaveStorage().

您可以通过在开始事务之前保存存储来实现事务,然后进行更改,如果您想回滚,只需调用Global.LocalStorage.ResetStorage().

当然,这一切只在您不需要高性能吞吐量并在单线程上访问数据库的情况下。

于 2015-09-05T21:18:36.927 回答