1、配置事务 //这里使用的是Mybatis,Mybatis+Spring的整合配置请看我其他的代码片段//启用注解事务管理,使用CGLib代理 @EnableTransactionManagement(proxyTargetClass = true)public class MybatisConfig {@Beanp
//这里使用的是Mybatis,Mybatis+Spring的整合配置请看我其他的代码片段 //启用注解事务管理,使用CGLib代理 @EnableTransactionManagement(proxyTargetClass = true) public class MybatisConfig { @Bean public DruidDataSource druidDataSource(){ //配置DataSource,省略 } @Bean public DataSourceTransactionManager transactionManager(){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(druidDataSource()); //note:事务管理器DataSourceTransactionManager中添加的DataSource,要 //和sqlSessionFactoryBean.setDataSource(druidDataSource())中的 //DataSource是相同的DataSource,异常才会生效 return transactionManager; } @Bean public SqlSessionFactoryBean sqlSessionFactory() throws IOException{ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(druidDataSource()); // sqlSessionFactoryBean的其他设置,省略 return sqlSessionFactoryBean; } }2、事务使用注意事项
@Transactional @RequestMapping("/testTransaction")//这是一个spring的controller public void controller() { try { /** * 这里模拟2个不同的service处理业务,2个不同的数据库表, * (当然我们可以有很多个service在这里)我们的设想是 * 只要有一个service出了异常则全部回滚 */ //service1处理业务 //service2处理业务 } catch (Exception ex) { /** * @Transactional的机制是:只要抛出异常,则回滚 * 异常一定要抛出,这样try里面的整个session才会回滚,不然spring不做正确的回滚, * 如上面service2出现异常,如果这里的异常并未抛出,而是做了不抛出处理,那么上方 * 的service1会commit,service2才会回滚。如果想做整个方法一起回滚的话,这样是 * 不会成功的,所以这里一定要throw出去 */ throw ex; }3、throw的异常处理:我们可以在统一的异常处理接口中处理我们知道的异常(存入数据库,生成logger日志,返回友好的异常展示等)
@Component //SpringMVC统一的异常处理类HandlerExceptionResolver public class ExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //handle exception:存入数据库,生成logger日志,返回友好的异常展示等 return null; } }