Транзакция не откатывается при возникновении RuntimeException - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу обновить контракт 1 и откатить контракт 7, когда метод update2 возникнет исключение.Но оба контракта были сохранены успешно.

Если я изменю propagation из update2 с REQUIRES_NEW на REQUIRED, это вызовет исключение "Transaction silently rolled back because it has been marked as rollback-only"

Как мне этого добиться?

@Service
public class UserService {
    @Autowired
    private ContractRepo contractRepo;

    @Autowired
    ContractService contractService;

    @Transactional(value = "transactionManager2")
    public void update1() {
        CONTRACT con1 = contractRepo.findById("1120180001").get();
        con1.setCONTRACT_DATE(new Date());
        contractRepo.save(con1);

        CONTRACT con7 = contractRepo.findById("1120180007").get();
        try {
            contractService.update2(con7);
        } catch (RuntimeException ex) {
            System.out.println("Exception when calling update2 " + ex.getMessage());
        }
    }
}

@Service
public class ContractService {
    @Autowired
    private ContractRepo contractRepo;

    @Transactional(value = "transactionManager2", propagation = Propagation.REQUIRES_NEW)
    public void update2(CONTRACT con) {
        con.setCONTRACT_DATE(new Date());
        contractRepo.save(con);
        throw new RuntimeException("RuntimeException update2: test for rollback");
    }
}

вызов метода обновления

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Autowired
    private UserService userService;

    @Override
    public void run(String... args) throws Exception {
        userService.update1();
    }
}
...