Skip to content

TransactionSynchronizationManager 事务同步器

情景: 有三个 事务操作 A B C A B 在同一个事务中执行 C 在 上一个事务提交后执行

java
package com.me.meterdemo.service;

import com.me.meterdemo.dao.EmpDao;
import com.me.meterdemo.entity.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;

@Service
public class EmpService {

    @Autowired
    EmpDao empDao;

    @Autowired
    TransactionTemplate transactionTemplate;
    @Transactional(rollbackFor = Exception.class)
    public String save(){
        boolean actualTransactionActive = TransactionSynchronizationManager.isActualTransactionActive();
        System.out.println("actualTransactionActive:"+actualTransactionActive);
        add1();
        add2();
//         作用是 当前事务提交后 在执行 保存的操作
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {

                    <!--  事务传播行为 必须设置为 新开一个事务  否则 由于当前事务已经提交 当前的事务不会生效
                transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
                transactionTemplate.executeWithoutResult(status2 -> {
                    System.out.println("status:"+status2);
                    add3();
                });
            }
        });



        return "emp";
    }


    public void add1(){
        Emp emp = new Emp();
        emp.setName("张三");
        empDao.save(emp);
    }
    public void add2(){
        Emp emp = new Emp();
        emp.setName("李四");
        empDao.save(emp);
    }


    public void add3(){
        boolean actualTransactionActive = TransactionSynchronizationManager.isActualTransactionActive();
        System.out.println("actualTransactionActive:"+actualTransactionActive);
        String currentTransactionName = TransactionSynchronizationManager.getCurrentTransactionName();
        System.out.println("currentTransactionName:"+currentTransactionName);
        System.out.println("add3");
        Emp emp = new Emp();
        emp.setName("王五1");
        empDao.save(emp);
        System.out.println(emp);
    }
}