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

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

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

spring在多个service中的方法不在同一个事物_第1张图片

问题出现的原因:
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)

你可能感兴趣的:(spring)