I can’t figure out what I’m missing and Google AI also hasn’t helped (I pass both of the requirements of [1] No self-invocation and [2] No swallowing of exceptions in the outer transaction method). I have an outer transaction method, performDBWrites() , which calls 2 inner transaction methods that call Oracle stored procedures, responseService.createResponse(..) and responseService.updateResponse(..) . The 2 inner transaction methods are propagation=Propagation.REQUIRED, readOnly=false, rollbackFor=Exception.class .