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

问题: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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值