По умолчанию A, B, C & D работают в одной транзакции.Уровень распространения транзакции по умолчанию - TX_REQUIRED, что означает, что новая транзакция запускается, если она не существует (A начинает одну, B, C, D участвует).
D может начать новую транзакцию, установив для ее уровня распространения значение TX_REQUIRES_NEW (если ваша среда это поддерживает).В этом сценарии, когда D завершен, приостановленная транзакция возобновляется.Фиксация D не влияет на результат транзакции A. Откат A не откатит D (уже зафиксирован), поскольку они являются отдельными транзакциями.
Кроме того, многие разработчики забывают, что только открытый метод может быть помечен как @TransactionalSpring использует прокси-серверы для управления транзакциями (частные / защищенные методы вызываются для «this» - таким образом, у прокси нет шансов совершить свою магию).Это не обязательно верно, если вы используете внедрение байт-кода вместо прокси.
Если вы хотите узнать больше о шаблонах проектирования транзакций, я настоятельно рекомендую следующую книгу (бесплатно! - требуется регистрация): http://www.infoq.com/minibooks/JTDS. Это очень простое чтение.