SpringBoot多线程进行事务管理

首先,各种原理、解决方案,什么使用注解、使用编程式、什么使用阿里巴巴开发的transmittable-thread-localGithub地址 中的TransmittableThreadLocal等等。

百度出来一大度,这里不做阐述,主打一个眼花缭乱,可以自行百度,不过在我看来只有最合适的方法,没有一定最好的方法,这里只是提供一种可用解决方案,以及自己记录罢了,不要杠我。

在Spring管理的类,如service中

scss 复制代码
@Autowired
PlatformTransactionManager transactionManager;

public void getInfoTransaction(int pageIndex) {
    // 创建新的事务
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    TransactionStatus status = transactionManager.getTransaction(def);
    try {
        // 处理业务
        
        // 事务提交
        transactionManager.commit(status);
    } catch (Exception e) {
        // 事务回滚
        transactionManager.rollback(status);
    }
}

可能这样你觉得这怎么用,还不是每次都要创建

但是

java 复制代码
// ServiceCommon接口 空又或者有getInfoTransaction方法,看自己
public abstract class ServiceCommonImpl implements ServiceCommon{
    @Autowired
    PlatformTransactionManager transactionManager;

    public abstract void getInfo();

    public void getInfoTransaction() {
        // 创建新的事务
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 处理业务
            getInfo();
            // 事务提交
            transactionManager.commit(status);
        } catch (Exception e) {
            // 事务回滚
            transactionManager.rollback(status);
        }
    }
}

public class Test extends ServiceCommonImpl{

    @Override
    public void getInfo() {
        // 业务实现
    }

    public void test(){
    // 获取线程池
        ThreadPoolExecutor threadPoolExecutor = SpringUtils.getBean("BfThreadPool");
        threadPoolExecutor.execute(() -> {
            // 使用
            getInfoTransaction();
        });
    }
   
}

你又说,这一个service我就不可能就一个方法用事务,方法改一改嘛

scala 复制代码
public abstract class ServiceCommonImpl implements ServiceCommon{
    @Autowired
    PlatformTransactionManager transactionManager;

     // 方法作为参数传入 
    public void getInfoTransaction(Consumer method) {
        // 创建新的事务
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 处理业务
            method.accept(null);
            // 事务提交
            transactionManager.commit(status);
        } catch (Exception e) {
            // 事务回滚
            transactionManager.rollback(status);
        }
    }

}

public class Test extends ServiceCommonImpl {

    public void test() {
        ThreadPoolExecutor threadPoolExecutor = SpringUtils.getBean("BfThreadPool");
        threadPoolExecutor.execute(() -> {
            getInfoTransaction((nullValue) -> {

            });
        });
    }
}

你又说,不好意思,想不到了,哈哈,G

研究其他方法吧,哈哈哈

最后,在非Spring管理类中,通过上下文获取事务管理器的bean,即transactionManager,不是PlatformTransactionManager,这个是个接口,具体实现的时候是动态加载实现类的,然后重复操作,你会发现没用,会报数据源为空的错误,有兴趣的可以试试。

至于原因,查了查,应该是Spring的事务管理器是会自动注入数据源的,你自己直接获取的是没有注入的,大概是这个意思,具体可以看以下感谢的文章。

感谢:

# Spring事务(Transaction)管理高级篇一栈式解决开发中遇到的事务问题

# 【老王读Spring Transaction-4】Spring事务管理的核心原理------PlatformTransactionManager&TransactionStatus

相关推荐
iCoding911 小时前
前端分页 vs 后端分页:技术选型
前端·后端·系统架构
mingtianyihou331 小时前
使用 Service Worker 限制请求并发数
前端
张可爱1 小时前
20251017-Vue2八股文整理(上篇)
前端
FanetheDivine1 小时前
ts中如何描述一个复杂函数的类型
前端·typescript
lightgis1 小时前
chrome中的axure插件提示无法不受支持
前端·chrome
速易达网络1 小时前
Vue3 原生移动应用开发来了
前端·javascript·css
GISer_Jing2 小时前
LLM对话框项目技术栈&重难点总结
前端·ai·node.js
我爱学习_zwj2 小时前
【鸿蒙进阶-7】鸿蒙与web混合开发
前端·华为·harmonyos
小谭鸡米花2 小时前
高德地图电子围栏/地图选区/地图打点
前端·javascript·vue.js
摆烂工程师2 小时前
什么是 ChatGPT Business 会员?与 ChatGPT Plus 有什么不同?
前端·后端·程序员