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沒有事務支持,所以整個調用都不會有事務

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