溫馨提示×

溫馨提示×

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

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

如何解決由于錯誤使用SpringBoot導(dǎo)致的問題

發(fā)布時間:2021-09-29 17:31:13 來源:億速云 閱讀:126 作者:柒染 欄目:大數(shù)據(jù)

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

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

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

1. 事務(wù)配置錯誤

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

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

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

好在黃天不負苦心人,靈光乍現(xiàn),猜測:會不會是執(zhí)行的數(shù)據(jù)源并沒有事務(wù)。與應(yīng)用啟動的時,創(chuàng)建的數(shù)據(jù)源并不是同一個。

抱著試試看的態(tài)度,我把斷點放在了啟動時,數(shù)據(jù)源bean生成的位置。最終發(fā)現(xiàn),果然啟動生成的bean與運行中的bean并不是同一個。。汗顏?。。?/p>

下面是原因說明:

根據(jù)業(yè)務(wù)代碼,產(chǎn)生該問題的條件

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

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

原因分析

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

  2. mybatis緩存DataSource(A)

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

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

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

  6. 事務(wù)方法執(zhí)行前,事務(wù)管理器,對DataSource (B) 設(shè)置setAutoCommit=0。并將DataSource與事務(wù)關(guān)系存放到map(C)中

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

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

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI