По последним данным, на рынке продается по крайней мере 2 768 942 книги о С++, не говоря уже о всевозможных курсах, обучающих программах, журналах и семинарах с коктейлями. И все же в этом изобилии наблюдается удручающее однообразие.
Семантика транзакций довольно легко распространяется и на многоуровневую отмену (если вспомнить концепции StackPtr, о которых говорилось выше). Существует два основных варианта реализации.
Класс LockPtr со стеками образов
Самый прямолинейный вариант реализации многоуровневой отмены для транзакций - включение стека старых образов в каждый LockPtr. Эта идея позаимствована из рассмотренного выше кода StackPtr. Тем не менее, она подходит лишь для консервативной блокировки. В случае с агрессивной блокировкой объект может быть впервые заблокирован уже после изменения остальных объектов. Это усложняет отмену нескольких изменений, поскольку стеки разных LockPtr не синхронизируются.
Стеки пар LockPtr/образ
К проблеме можно подойти и иначе - включить в Transaction стек, в котором хранятся пары старый образ/LockPtr. На каждом уровне стека хранятся лишь те LockPtr, которые существовали на момент закрепления. В общем случае это решение работает лучше, к тому же оно чуть более эффективно - вы используете один большой стек вместо множества маленьких.
Просматривать полку книг о С++ в книжном магазине ничуть не интереснее, чем литературу по бухгалтерии. В сущности, все книги пересказывают одно и то же и отличаются разве что по весу и количеству цветов в диаграммах и таблицах.