Я не знаю, как реализовать свойство отмены дружественных интерфейсов с использованием транзакционной базы данных.
С одной стороны, желательно, чтобы пользователь имел возможность многоуровневого (бесконечного) удаления, как указано здесь в ответе. Шаблоны, которые могут помочь в этой проблеме: Memento или Command .
Однако, используя сложную базу данных, включающую триггеры, постоянно растущие порядковые номера и необратимые процедуры, трудно представить, как действие отмены может работать в разных точках, чем границы транзакции.
Другими словами, отменить до того момента, когда транзакция, совершенная в последний раз, является просто откатом, но как можно вернуться к другим моментам?
ОБНОВЛЕНИЕ (основываясь на ответах на данный момент): я не обязательно хочу, чтобы отмена работала, когда модификация уже зафиксирована, я бы сосредоточился на работающем приложении с открытой транзакцией. Всякий раз, когда пользователь нажимает «Сохранить», это означает фиксацию, но перед сохранением - во время той же транзакции - отмена должна работать. Я знаю, что использование базы данных в качестве постоянного слоя - это просто деталь реализации, и пользователь не должен беспокоиться об этом. Но если мы думаем, что «идея отмены в базе данных и в GUI - это принципиально разные вещи», и мы не используем отмену в базе данных, то бесконечное удаление - просто модное слово.
Я знаю, что «откат - это не отмена пользователя».
Итак, как реализовать отмену на уровне клиента с учетом "каскадных эффектов в результате любых изменений" внутри одной и той же транзакции?