1,事务方法非public修饰


2,非事务方法调用事务方法


@Service
public class OrderService {
    
    public void createOrder(){
        // ... 准备订单数据
        
        // 生成订单并扣减库存
        insertOrderAndReduceStock();
    }
    
    @Transactional
    public void insertOrderAndReduceStock(){
        // 生成订单
        insertOrder();
        // 扣减库存
        reduceStock();
    }
}

解决方案: 使用代理对象调用师傅方法

3,事务方法的异常被捕获了

4,事务异常类型不对


5,事务传播行为不对 

@Service
 public class OrderService {
    @Transactional
    public void createOrder(){
        // 生成订单
        insertOrder();
        // 扣减库存
        reduceStock();
        throw new RuntimeException("业务异常");
    }
    @Transactional
    public void insertOrder() {
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void reduceStock() {
    }
 }

6,没有被Spring管理 

 
//  @Service
 public class OrderService {
    @Transactional
    public void createOrder(){
        // 生成订单
        insertOrder();
        // 扣减库存
        reduceStock();
        throw new RuntimeException("业务异常");
    }
    @Transactional
    public void insertOrder() {
    }
    @Transactional
    public void reduceStock() {
    }
 }

解决办法: 


 我们可以借助AspectJ来实现。

1,引入AspectJ依赖:

<!--aspecj-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

2,暴露代理对象

在启动类上添加注解,暴露代理对象

事务失效问题-LMLPHP

3, 使用代理对象调用

事务失效问题-LMLPHP

03-09 00:47