溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決由于錯誤使用SpringBoot導致的問題

發布時間:2021-09-29 17:31:13 來源:億速云 閱讀:147 作者:柒染 欄目:大數據

如何解決由于錯誤使用SpringBoot導致的問題,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

在某一天,有個業務線同鞋找到筆者,說,他們的一個應用事務失敗了沒有回滾。已經與DBA對過數據,且自行查看代碼中的事務使用方式也沒有問題。后在筆者的多番勞作中,找到了問題的原因。說起來引起該故障的原因很簡單,但查詢的新路歷程值得說道說道。

如果業務童鞋說的正確的話。事務配置成功、且有效。那這個問題就表現的很詭異,或者說幾乎不可能。所以筆者第一個懷疑的對象是:

1. 事務配置錯誤

通過簡單跟蹤、測試,敲定事務確實沒啥問題。。此時腦海中1萬個問號??

2. 后續周圍的同事,都對該問題比較感興趣,一一提出假設,最終都被一一排除。

無奈之下,筆者只好一點點跟蹤代碼,雖說,Idea的debug模式已經很好用,但一通操作下來,還有有些難度。

好在黃天不負苦心人,靈光乍現,猜測:會不會是執行的數據源并沒有事務。與應用啟動的時,創建的數據源并不是同一個。

抱著試試看的態度,我把斷點放在了啟動時,數據源bean生成的位置。最終發現,果然啟動生成的bean與運行中的bean并不是同一個。。汗顏?。?!

下面是原因說明:

根據業務代碼,產生該問題的條件

  1. 啟動過程中,吃掉啟動異常,導致容器無法因為異常 而 終止掉

  2. 啟動過程中,拋出異常

原因分析

  1. spring容器啟動之后,初始化bean: DataSource (A)

  2. mybatis緩存DataSource(A)

  3. 容器啟動異常,spring清除所有已緩存的bean信息。

  4. 由于啟動類中,吃掉了容器啟動異常。容器未掛掉

  5. 此時dubbo請求進來之后,由于spring中的所有bean信息都被清除,因此。容器重新初始化bean。此時生成DataSource (B)、事務管理器

  6. 事務方法執行前,事務管理器,對DataSource (B) 設置setAutoCommit=0。并將DataSource與事務關系存放到map(C)中

  7. myabtis在執行時會從 第6步的map中,根據DataSource(A) 獲取事務信息。在這種情況下,是無法獲取到的。導致執行sql執行的采用的是DataSource(A)。而這個DataSource(A)從未設置setAutoCommit=0。導致事務無法回滾

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女