zoukankan      html  css  js  c++  java
  • Spring事务传播行为中可能的坑点

    一、简介

      Spring事务配置及相关说明详见:https://www.cnblogs.com/eric-fang/p/11052304.html。这里说明spring事务的几点注意:

      1、默认只会检查回滚RuntimeException的异常。

      2、@Transactional注解只能作用于public的方法上,默认传播行为 Propagation.REQUIRED

      3、service内部方法之间的调用,不会被spring拦截到,也即不会产生事务

    二、坑点

      主要的坑点就是在嵌套事务上,当service内部方法之间调用的时候,很可能会产生预期之外的效果。例如下例子:

        saveUser保存用户,如果过程出现异常,则执行saveMsg方法。

    public class UserServiceImpl implements UserService{
    
    	@Autowired
    	private UserDao userDao;
    	@Autowired
    	private MsgDao msgDao;
    	@Autowired
    	private MsgService msgService;
            @Autowired
            private UserService userService;
    
    	
    	@Transactional(propagation = Propagation.REQUIRED)
    	public void saveUser(User user) throws Exception {
    		System.out.println(user.toString());
    		try {
    			userDao.saveUser(user);
    			int i = 1/0;
    //			saveUser2(user);
    		} catch (Exception e) {
    //			msgService.saveMsg();
    //                      this.saveMsg();
    			userService.saveMsg();
    			throw new RuntimeException();
    		}
    	}
    	
    	@Transactional(propagation = Propagation.REQUIRES_NEW)
    	public void saveMsg() {
    		TbMsg msg = TbMsg.builder().name("xiaocao").msg("xiaoxiao").age(27).build();
    		msgDao.saveMsg(msg);
    	}
    }        

      单元测试,调用saveUser方法,并没有达到想要的效果(saveUser异常,SaveMsg隔离级别是REQUIRES_NEW,理论上应该能入库)。

      失败原因即是上面第一节中说的:同一个service中的方法调用,不会产生新事务。Spring 事务的管理控制,主要是通过AOP的动态代理增强来实现的,目标对象本身并没有任何的事务管理能力,都是通过代理对象动态增强功能去实现事务管理。在同一个service中的方法调用,相当于是目标对象本身的this调用,并没有经过代理对象,所以自然的事务配置的嵌套均无效。

      解决策略:

      1、saveMsg移动到另一个service中,在UserServiceImpl中导入MsgService,saveUser中通过MsgService类去调用。

      2、UserServiceImpl中注入自己,通过注入的自身service进行调用。

  • 相关阅读:
    Vue里用moment.js
    回到顶部|回到底部功能的实现(Vue)
    Vue绑定下拉框型的树
    Excel导入数据库前后端代码
    Windows应用程序开发笔记-控制和获取其他程序窗口控件内容
    SQL Server查询、添加、修改表和字段的备注描述
    windows 共享文件夹,和共享打印机
    Visual Studio 2015安装过程卡住,解决办法
    python绘图 初识Python绘图
    GCC、LLVM、Clang
  • 原文地址:https://www.cnblogs.com/eric-fang/p/11059377.html
Copyright © 2011-2022 走看看