1. 程式人生 > >spring在多個service中的方法不在同一個事物

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)

相關推薦

no