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);
}
}