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没有事务支持,所以整个调用都不会有事务