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

旧城等待, 2024-02-17 21:11 11阅读 0赞

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

目标:用最简单的配置,使用 spring @Transactional 注解管理事务

一、问题及解决方案
问题1:配置错误
描述:已经使用 @Transactional 注解,但是在 mybatis 的 sql track 检测到,“Closing non transactional SqlSession” 提示,表示关闭了一个没有事务的 sqlsession
解决:排查是否缺少 DataSourceTransactionManager 和 tx:annotation-driven 的配置,缺一不可

  1. <!-- 3 事务管理 -->
  2. <!-- 3.1 注册(事务管理)transaction manager, use JtaTransactionManager for global tx -->
  3. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  4. <!-- 管理的数据源 -->
  5. <property name="dataSource" ref="demoDataSource" />
  6. </bean>
  7. <!-- 3.2 开启使用annotation(注解)控制事务,基于类的事务将启用,默认为“基于接口的代理将起作用” -->
  8. <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 捕获

  1. //checked 异常
  2. private void testCheckedException() throws Exception{
  3. throw new Exception("checked exception");
  4. }
  5. //unchecked 异常
  6. private void testUnCheckedException(){
  7. throw new RuntimeException("checked exception");
  8. }

三、构建一个 mybatis、springmvc 整合实例,使用两种事务控制方式

  1. /**
  2. * 添加记录,测试事务(引发异常则事务自动回滚)
  3. * @param info
  4. * @param isRollback 是否回滚事务
  5. * @return
  6. * @throws Exception
  7. */
  8. @Transactional
  9. public int addUserInfoTranAuto(UserInfoModel info,boolean isRollback)
  10. {
  11. int n = dao.addUserInfo(info);
  12. if(isRollback){
  13. //注:spring 默认只有运行时异常(unchecked exception)才会回滚事务,即 RuntimeException 及其子类
  14. throw new RollbackException("事务回滚(RuntimeException)");
  15. }
  16. return n;
  17. }
  18. /**
  19. * 添加记录,手动事务控制
  20. * @param info
  21. * @param isRollback
  22. * @return
  23. * @throws Exception
  24. */
  25. @Transactional
  26. public int addUserInfoTranManual(UserInfoModel info,boolean isRollback) throws Exception {
  27. try {
  28. int n = sqlSession.insert("me.daos.UserInfoDao.addUserInfo",info);
  29. if(isRollback){
  30. throw new Exception("事务回滚");
  31. }
  32. sqlSession.commit();
  33. return n;
  34. } catch (Exception e) {
  35. sqlSession.rollback();
  36. e.printStackTrace();
  37. return -99;
  38. }
  39. }

发表评论

表情:
评论列表 (有 0 条评论,11人围观)

还没有评论,来说两句吧...

相关阅读