Транзакции в Graph Engine

Можно ли реализовать транзакции в Graph Engine?

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

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

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

2 ответа

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

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

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

Журнал упреждающей записи сбрасывается на диск только в конце области "использования" - когда средство доступа удаляется и блокировка в памяти собирается быть снята.

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

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

Другие вопросы по тегам