spring在多个service中的方法不在同一个事物

本文探讨了Spring框架在特定配置下初始化两次的问题,分析了由此导致的两个Service实例不在同一事务中的原因。主要涉及DefaultListableBeanFactory实例不一致及TransactionManager获取连接机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:1、spring重启在启动阶段初始化两次
第一次通过web.xml配置以XmlWebApplicationContext为入口
第二次通过ClassPathXmlApplicationContext为入口
2、业务类SpringContextUtil在初始化时实现了ApplicationContextAware,spring自动注入ApplicationContext applicationContext。因为初始化两次applicationContext为第二次ClassPathXmlApplicationContext。
3、当使用注解生成的service实例方法中使用SpringContextUtil实例化另一个Service实例,两个Service实例都调用数据库,出现不在同一个事物中。两个Service中的都注解配置类事物事物传播为默认。

本过程主要展现了获取数据源、判断是否存在事物

这里写图片描述

问题出现的原因:
1、因为初始化两次导致生成了两套ApplicationContext,在第3步两次次调用DefaultListableBeanFactory的实例不是同一个,而配置文件中配置的两次获取TransactionManager(其中包含数据源)为单例,而DefaultListableBeanFactory实现了SingletonBeanRegistry接口。所以不同的DefaultListableBeanFactory持有不同的单例TransactionManager。
2、在第7步判断事物是否存在,会根据TransactionManager是否持有connection作为依据,而connection会保存在Threadlocal中的map,key为数据源对象,因为两个service数据源不同则第二个service拿不到第一个service存放的connection导致spring为第二个service获取了一个新的connection并创建了新的事物。
所以导致两个service方法不在同一个事物中。

TransactionSynchronizationManager 保存当前线程中数据源(dataScore)对应的数据库连接(connection)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值