Я хочу обновить контракт 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();
}
}