java-mybatis、springmvc 整合,使用 @Transactional 时遇到的事务相关问题

    xiaoxiao2021-04-19  88

    java-mybatis、springmvc 整合,使用 @Transactional 时遇到的事务相关问题 目标:用最简单的配置,使用 spring @Transactional 注解管理事务 一、问题及解决方案 问题1:配置错误 描述:已经使用 @Transactional 注解,但是在 mybatis 的 sql track 检测到,“Closing non transactional SqlSession" 提示,表示关闭了一个没有事务的 sqlsession 解决:排查是否缺少 DataSourceTransactionManager 和 tx:annotation-driven 的配置,缺一不可 <!-- 3 事务管理 --> <!-- 3.1 注册(事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 管理的数据源 --> <property name="dataSource" ref="demoDataSource" /> </bean> <!-- 3.2 开启使用annotation(注解)控制事务,基于类的事务将启用,默认为“基于接口的代理将起作用” --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 问题2:使用错误 描述:@Transactional 默认只对 unchecked exception 异常进行回滚操作,checked、unchecked 异常使用不当造成事务无效 解决:为了统一在项目定义一个类 RollbackException 异常,该类集成 RuntimeException,约定系统内回滚throw该异常,以免混淆两种异常 二、java 中 checked、unchecked 异常区别 定义:Java语言规范对这两个的定义,将派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常。 语法:checked 异常,必须显示的在参数列表后进行 throws 定义或加 try 捕获 //checked 异常 private void testCheckedException() throws Exception{ throw new Exception("checked exception"); } //unchecked 异常 private void testUnCheckedException(){ throw new RuntimeException("checked exception"); } 三、构建一个 mybatis、springmvc 整合实例,使用两种事务控制方式 /** * 添加记录,测试事务(引发异常则事务自动回滚) * @param info * @param isRollback 是否回滚事务 * @return * @throws Exception */ @Transactional public int addUserInfoTranAuto(UserInfoModel info,boolean isRollback) { int n = dao.addUserInfo(info); if(isRollback){ //注:spring 默认只有运行时异常(unchecked exception)才会回滚事务,即 RuntimeException 及其子类 throw new RollbackException("事务回滚(RuntimeException)"); } return n; } /** * 添加记录,手动事务控制 * @param info * @param isRollback * @return * @throws Exception */ @Transactional public int addUserInfoTranManual(UserInfoModel info,boolean isRollback) throws Exception { try { int n = sqlSession.insert("me.daos.UserInfoDao.addUserInfo",info); if(isRollback){ throw new Exception("事务回滚"); } sqlSession.commit(); return n; } catch (Exception e) { sqlSession.rollback(); e.printStackTrace(); return -99; } }
    转载请注明原文地址: https://ju.6miu.com/read-675962.html

    最新回复(0)