Q: 類中方法間調用事務不生效
UserServiceImpl
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
@Transactional
public void insertRecord() {
jdbcTemplate.execute("insert into foo (bar) values ('aa')");
}
@Override
@Transactional(rollbackFor = UnexpectedRollbackException.class)
public void insertThenRollback() {
jdbcTemplate.execute("insert into foo (bar) values ('bb')");
throw new UnexpectedRollbackException("拋出錯誤");
}
@Override
public void invokeInsertThenRollback() throws UnexpectedRollbackException{
insertThenRollback();
}
@Test
public void rollbackTest() {
userService.insertRecord();
log.info("aa {}", jdbcTemplate.queryForObject("select count(*) from foo where bar = 'aa'", Long.class));
jdbcTemplate.queryForList("select * from foo").forEach(o -> log.info(o.toString()));
try {
userService.insertThenRollback();
} catch (Exception e) {
log.info("bb {}", jdbcTemplate.queryForObject("select count(*) from foo where bar = 'bb'", Long.class));
}
try {
userService.invokeInsertThenRollback();
} catch (Exception e) {
log.info("bb {}", jdbcTemplate.queryForObject("select count(*) from foo where bar = 'bb'", Long.class));
}
}
結果是:
aa 1
bb 0
bb 1
原因:spring中爲類做了代理,調用代理類才能調用到被增強(aop)的方法,類的內部調用不會走代理類被增強的方法,因爲invokeInsertThenRollback沒有事務支持,所以整個調用都不會有事務