spring 事务不生效

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章