Spring事务失效的原因和解决方案

Spring事务失效的原因

  • private、static、final的使用
  • 通过this.xxx()调用当前类的方法
  • 线程Thread中声明式事务不起作用

Spring事务失效的解决方案

  • private、static、final的使用

这一原因的解决方案很简单,我们只需要:不在类和方法上使用此类关键字即可。

  • 通过this.xxx()调用当前类的方法
    这一原因的解决方案如下:
@Service
public class TaskService {

    @Autowired
    private TaskManageDAO taskManageDAO;

    @Transactional
    public void test1(){  
    	// 方法1:   
    	Task task = new Task();
        // ...
        taskManageDAO.save(task);
		
		// 方法2:
        this.test2();//这里调用会使事务失效,两条数据都会被保存
        /*           
        原因是:JDK的动态代理。
        在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象
        只有被动态代理直接调用的才会产生事务。
        这里的this是(TaskService)真实对象而不是代理对象
         */
         
         // 解决方法
        getService().test2();
    }

    @Transactional
    public void test2(){
        Task task = new Task();
        // ...
        taskManageDAO.save(task);
        throw new RuntimeException();
    }
    
    // 解决事务失效
	private TaskService getService(){
		return SpringUtil.getBean(this.getClass());
	}
	
 }

SpringUtil 可以用hutool的工具类

你可能感兴趣的:(spring,java,后端)