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)

相關推薦

springservice方法不在同一個事物

問題:1、spring重啟在啟動階段初始化兩次 第一次通過web.xml配置以XmlWebApplicationContext為入口 第二次通過ClassPathXmlApplicationContext為入口

c++檔案如何共用一個全域性變數

例子: 標頭檔案:state.h   原始檔:state.cpp         其它原始檔:t1.cpp  t2.cpp  t3.cpp, 這些原始檔都包含標頭檔案state.h。 需要定義一個全域性變數供這些原始檔中使用:方法如下 1、在 state.h宣告全域性變數: extern inta; 2、在

android gradle編譯 flavor載入不同的android library的flavor

Library build.gradle: apply plugin: 'com.android.library' android { .... publishNonDefault true productFlavors {

一個jsp頁面提交按鈕提交不同的頁面

<span style="font-size:24px;">登入註冊頁面:</span> form action="LoginServlet" name="loginform" method="post">        

csv檔案合併到一個excel檔案的不同的sheet

清楚工作表和工作簿的區別,下面的程式碼可以把同文件夾下的CSV檔案複製到一個工作簿的不同工作表中。但在EXCEL2003中工作表的數量不能超過256個,否則會出錯。 Private Sub copy_csvfile_to_excel() Dim MyPath$, myFi

gsoap 在一個客戶端呼叫service的解決方案

文件上關於這個的解決方案有兩種 1.使用wsdl2h將多個wsdl生成為一個wsdl. 2.使用-q指定C++名稱空間 方法1.沒有成功,而且還要解決一大堆的名稱空間問題 方法2.必須生成一個額外的沒有名稱空間的env,不然stdsoap2.cpp 編譯不過.而且使用env

一個專案,建立工程檔案目錄建立方法

個人建議直接看文章的最後部分的那種方法,那種方法容易上手,前面幾種很麻煩很累原始碼地址:https://download.csdn.net/my這個程式碼肯定有用,保證能執行。是我自己寫1、在D盤建立空資料夾qMulti 2、使用Qt Creator建立App應用程式:Big

服務器訪問不同數據庫的表的方法

通過 open onf code eight value use rom str /*跨多個服務器訪問不同的表的方法一 *先創建鏈接服務器TESTT, *在MSSQL2008下不能直接修改鏈接服務器 ‘TESTT‘ 的RPC配置成TURE,可以通過語句修改如下: */ U

微服務架構下使用Spring Cloud Zuul作為網關將微服務整合到一個Swagger服務上

turn 接口文檔 vid 使用方法 數據操作 prefix opera tor font 註意:   如果你正在研究微服務,那必然少不了服務之間的相互調用,哪麽服務之間的接口以及api就必須生成系統的管理文檔了。如果你希望更好的管理你的API,你希望有一個工具能一站式地解

按鈕,點擊一個變色,點擊另一個變色,原來的恢復顏色的方法

click dcl 多個 cti 方法 fault tar span 變色 <a class="btn btn-default changChick" onclick="changChick(this)">高</a> <a class="btn

ETL工具kettle怎麽將轉換集成到一個作業

順序 tar size 作業 ext watermark mar proc 很多 在實際工作中,經常會出現很多個轉換,這樣管理成本會很高,那麽這時就可以采取一種方式將這些轉換集成到一個作業之中,可以看一個現成的例子,如圖我們在這一個作業中集成了四個轉換,有一點需要說明,就是

當xlsxsheet,讀取其中一個sheet

以下讀取方法主要是自己認為比較簡單的方式 如果知道sheet_name,直接 import pandas as pd pd.read_excel(data_file,sheet_name) 獲取sheet_names的方法 import openpyxl wb = openpyxl.

頁面跳轉到一個頁面,每次跳轉顯示不一樣的內容,相同功能形式不同的jsp頁面整合成一個 根據傳遞的引數值來決定跳轉的jsp頁面該顯示什麼樣的內容,避免newjsp頁面,節省資源

在jsp開發過程中,會遇到這樣的情況; 一個頁面跳轉到另一個頁面,需要兩個jsp頁面; 如果有5、6種不同的一個頁面跳轉到另一個不同的jsp頁面的時候,基本的功能都差不多,類似的情況,如果建立很多的jsp,會導致資源浪費,還有就是建立多個jsp頁面到後來自己都有點暈; 那麼只需要在傳遞的

【Java】echarts,highchartsy軸對應的一個x軸的數量的Java對應排序程式碼(一個key下的value值對應key的位置)

1.首先,可以很輕鬆的從後臺資料庫獲取多個list。list如下: 2.根據其中一個的list的排序,獲取出x軸的陣列。(echarts,highcharts的X,Y軸一般為陣列)    Java程式碼: String x[] = new String[li

shell執行命令的方法

shell中執行多個命令的方法 1、在命令列中同時輸入多個語句: 直接在linux命令列中可以依次執行多個命令,多個命令間可採用“;”、“&&”和"||"分割,三個分隔符作用不同: (1);分割符:前後命令間沒有必然的聯絡,前一個執行結束後、再執行第二個,沒有邏輯關聯;

Tomcat配置網站,站點的方法

最近想要在tomcat中部署多個網站,但是不知道怎麼配置,通過查詢資料和摸索,發現要實現這一點其實還是很簡單的。 如何利用Tomcat建立多個Web應用 呢? 重點就是:server.xml檔案的配置 找到server.xml配置檔案中的<Host>節點,通過增加h

C獲取函式值的方法

C: 關於函式返回值的小思考 1.函式的返回值只能有一個,但如果希望獲得函式中的多個值,可以採用指標的方式。 2.注意向函式傳遞列指標的形式: void InputArray(int *p, int m, int n){ //這裡傳入的是二維陣列,但形參指標是一

把C#程式(含Dll)合併成一個Exe的超簡單方法

開發程式的時候經常會引用一些第三方的DLL,然後編譯生成的exe檔案就不能脫離這些DLL獨立運行了。 但是,很多時候我們本想開發一款只需要一個exe就能完美執行的小工具。那該怎麼辦呢? 下文介紹一種超簡單的方法,不用寫一行程式碼就可輕鬆實現。 這裡我們需要用到一款名為Fody.Costura的工具。Fo

linux的shell指令碼執行命令的方法

第一種是以分號(;)進行劃分:表示:各命令的執行的果,不會影響其它命令的執行。換句話說,各個命令都會執行,但不保證每個命令都執行成功。 第二種命令之間&&隔開 表示:若前面的命令執

原生js給DOM元素新增一個或者類的方法總結

先看兩個例子: html: <div class="test" id="test"> 啦啦啦 </div> css: .test{ width: 100px; hei