2015-09-05 4 views
2

Возможно ли реализовать транзакции в Graph Engine?Сделки в Graph Engine

Мне нравится делать несколько обновлений в разных ячейках, а затем совершать или откатывать эти изменения.

Даже с одной ячейкой это сложно. Когда я использую следующий код, модификация не записывается на диск, но память изменяется!

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

ответ

0

Мое понимание: Независимо от того, вас бросает это исключение или нет: Изменения всегда только в памяти - пока вы явно не вызовете Global.LocalStorage.SaveStorage().

Вы можете осуществить транзакцию, сохранив хранилище перед началом транзакции, а затем внесите изменения, и в случае, если вы хотите откат, просто позвоните Global.LocalStorage.ResetStorage().

Все это, конечно, только если вам не нужна высокая производительность и доступ к базе данных в одном потоке.

0

Журнал записи на запись только сбрасывается на диск в конце области «использования» - при размещении устройства доступа и блокировки в памяти хранятся.

Это похоже на мини-транзакцию в одной ячейке. Другие не могут получить доступ к соте, когда вы держите замок. Вы могли бы сделать несколько изменений в ячейке и «зафиксировать» их в конце - или, сделав теневую копию в начале области использования, а затем откат позже к этой копии, когда что-то пойдет не так (это все еще ручной процесс хоть).

Также, пожалуйста, проверьте это: https://github.com/Microsoft/GraphEngine/tree/multi_cell_lock Мы работаем над тем, чтобы один поток мог удерживать несколько замков. Это упростит реализацию транзакций с несколькими объектами.