Я пытаюсь найти лучший способ обработки транзакций на уровне объекта (не на уровне базы данных). Краткий пример: 4 объекта A, B, C и D. A запускает транзакцию и вызывает методы в B и C. В то время как эта транзакция C также вызывает D. Вызываемые методы не всегда должны участвовать в этой транзакции, но можно назвать и самостоятельно. Существуют ли какие-либо шаблоны для управления транзакциями на уровне объекта?
Я ничего не нашел, поэтому придумал: используйте TransactionContext, где можно зарегистрировать TransactionListeners. Если транзакция запускается с использованием TransactionContext, то она внедрит запущенную транзакцию в каждого из зарегистрированных слушателей, которые, в свою очередь, будут использовать запущенную транзакцию или в противном случае запустят ее самостоятельно, если это необходимо. Таким образом, я могу свободно решать, хочу ли я участвовать в моей транзакции или нет.
Проблема возникает при наличии цепочек вызова объектов, как описано выше. При запуске транзакции я просто знаю, что B и C должны участвовать в транзакции, поэтому я добавляю их в TransactionContext. Но как насчет D? Я действительно не хочу передавать TransactionContext B и C.
Буду признателен за некоторую информацию о моем подходе, а также за некоторые указания на проверенные шаблоны (даже лучше).