Netbeans имеет что-то вроде этого.
здесь существует демонстрация: http://www.netbeans.org/kb/55/persistence-demo.html
Практически каждый вариант для этого требует одного из трех основных методов:
Например, Программная транзакционная память , о которой вы упомянули, следует третьему подходу. Приятно то, что он может оптимистично работать с данными и просто выбросить журнал при успешной фиксации.
Взгляните на исследовательский проект Microsoft, SXM .
Со страницы Мориса Херлихи вы можете загрузить документацию, а также образцы кода .
Вы спросили:
«Что, если во время фиксации произойдет ошибка?»
Это не имеет значения. Вы можете зафиксировать где-то / что-то в памяти и тем временем проверить, удалась ли операция. Если это так, вы меняете ссылку намеченного объекта (объект A) на то, где вы зафиксировали (объект B). Тогда у вас есть отказоустойчивые фиксации - ссылка обновляется только при успешной фиксации. Изменение ссылки является атомарным.
public void TransactionalMethod()
{
var items = GetListOfItems();
try {
foreach (var item in items)
{
MethodThatMayThrowException(item);
item.Processed = true;
}
}
catch(Exception ex) {
foreach (var item in items)
{
if (item.Processed) {
UndoProcessingForThisItem(item);
}
}
}
}
Очевидно, что выполнение команды «Отменить ...» оставлено как упражнение для читателя.