一般情况下,我们在使用事务时,都是在方法上添加一个@Transactional
注解
@Transactional(rollbackFor = Exception.class)
public void test1() {
}
但是有些时候,除了主要核心业务外,我们可能还需要推送消息,但是推送消息我们又需要使用我们核心业务的数据,比如我在核心业务代码中执行了插入,之后需要异步获取插入的数据,推送消息或者发送给异构系统,这个时候,我们可以使用Spring Boot提供的TransactionSynchronization
接口,并实现afterCommit
方法
package com.example.demo.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import javax.annotation.Resource;
@Service
public class Test123Service {
@Resource
Test2Service test2Service;
@Transactional(rollbackFor = Exception.class)
public void test1() {
boolean synchronizationActive = TransactionSynchronizationManager.isSynchronizationActive();
if (synchronizationActive) {
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
test2Service.test2();
}
}
);
} else {
test2Service.test2();
}
}
}
package com.example.demo.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class Test2Service {
@Async
public void test2(){
System.out.println("test2");
}
}
评论 (1)