2

Graph Engine でトランザクションを実装することは可能ですか?

異なるセルで複数の更新を行ってから、これらの変更をコミットまたはロールバックするのが好きです。

1セルでも難しい。次のコードを使用すると、変更はディスクに書き込まれませんが、メモリは変更されます!

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

2 に答える 2

1

私の理解は次のとおりです。この例外をスローするかどうかに関係なく、変更は常にメモリ内にのみあります-明示的に呼び出すまでGlobal.LocalStorage.SaveStorage().

トランザクションを開始する前にストレージを保存してからトランザクションを実装し、変更を加えます。ロールバックする場合は、 を呼び出すだけGlobal.LocalStorage.ResetStorage()です。

もちろん、これはすべて、高パフォーマンスのスループットを必要とせず、単一のスレッドでデータベースにアクセスする場合に限られます。

于 2015-09-05T21:18:36.927 に答える
1

先行書き込みログは、「使用」スコープの最後にのみディスクにフラッシュされます。これは、アクセサーが破棄され、メモリ ストレージのロックが解放されようとしているときです。

これは、単一セルでのミニトランザクションのようなものです。ロックを保持している間、他のユーザーはセルにアクセスできません。セルに複数の変更を加え、最後にそれらを「コミット」するか、使用スコープの最初にシャドウ コピーを作成し、後で何か問題が発生したときにこのコピーにロールバックすることができます (これはまだ手動プロセスです)。けれど)。

また、こちらもご覧ください: https://github.com/Microsoft/GraphEngine/tree/multi_cell_lock 1 つのスレッドで複数のロックを保持できるように取り組んでいます。これにより、マルチエンティティ トランザクションの実装がはるかに簡単になります。

于 2017-05-09T14:04:39.963 に答える