zoukankan      html  css  js  c++  java
  • Spring

    以Transaction注解为例:

    @Service
    public class TestService {
    
        @Autowired
        Dao dao;
    
        @Transactional
        public void methodOne(Object o) {
            dao.save(o);
        }
    
        public void methodTwo(Object o) {
            methodOne(o);
        }
    }

    检查事务是否启动:

    设置log leve为debug,可以查看是否有下面这个log,判断是否启动了Transaction:
    DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name...

    原因:

    Spring在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,Spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用方法之前就会启动Transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动Transaction,我们看到的现象就是@Transactional注解无效。

    示例:

    @Service
    class TestService{
    
        @Transactional
        void methodOne(){
            ...
        }
    
        void methodTwo(){
            methodOne();
        }
    }
    
    //Spring扫描注解后,创建了另外一个代理类,并为有注解的方法插入一个startTransaction()方法:
    class proxy$TestService{
    
        TestService testService = new TestService();
    
        void methodOne(){
            startTransaction();
            testService.methodOne();
        }
    
        void methodTwo(){
            //由于methodTwo()没有注解,所以不会启动transaction,而是直接调用TestService的实例的methodTwo()方法
            testService.methodTwo(); 
        }
    }

    解决方法:

    1.把这两个方法分开到不同的类中。

    2.把注解加到类名上面。

    转自:https://blog.csdn.net/clementad/article/details/47339519

  • 相关阅读:
    ubuntu16.04下vim安装失败
    Sql Server函数全解(三)数据类型转换函数和文本图像函数
    Sql Server函数全解(二)数学函数
    Sql server 2008 中varbinary查询
    处理乱码问题
    快速排序
    《Java编程思想》笔记 第二章 一切都是对象
    1021: 组合数末尾的零
    11462
    The Bus Driver Problem
  • 原文地址:https://www.cnblogs.com/helios-fz/p/10996932.html
Copyright © 2011-2022 走看看