Spring Data Transaction spanning multiple Repositories

1) you need check that you don't have set autocommit = false.

2) wrap save operations into one service method and make it @Transactioal. But if you use save() custom method check that save in not marked as @Transactioal with propagation level required_new or nested. If you need you can use REQUIRES_NEW for saving service method to make this service method transaction independent of other transactions.

also you can wrap in with TransactionTemplate.

private TransactionTemplate transactionTemplate;

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    public void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

It is usually a wrong idea to have @Transactional declared around repository methods.

Repositories are only for you to access domain entities. Business logic normally involves multiple domain entities and collaborations between them.

In your architecture you should have a layer to compose business logic. This usually corresponds to a service exposed to external.

This is usually the place you should have your transaction boundary set on. Usually it is a Controller, or a Service method.