spring 聲明式事物遇到的問題及解決辦法

問題描述:項目裏有一個接口微信企業轉賬到個人零錢,轉賬成功後需要記錄轉賬流水,遇到一個bug,轉賬成功了但是記錄流水sql錯誤,導致用戶錢到賬了,但是這條提現記錄的狀態還是待審覈,因爲涉及第三方接口,所以簡單的事物控制不起作用
解決辦法:
審覈通過是主方法,主方法裏面有兩個子方法,一個是公司轉賬記錄,一個是微信轉賬,首先在主方法上配置事物 @Transactional,公司轉賬方法上也配置 @Transactional,微信轉賬上配置 @Transactional(propagation = Propagation.REQUIRES_NEW),然後運行發現微信轉賬失敗記錄異常成功後返回false到主方法,然後拋異常,結果全部回滾,不可思議,然後我去掉事物註解,發現只要拋異常就都會回滾,無可奈何花落去,這時已經很晚了,頭又痛,晚飯還沒喫,於是就回去,晚上躺在牀上還在思考,八成是因爲配置了全局事物處理,第二天一早打開代碼一看,在這裏插入圖片描述果然有,於是去掉,成功了第一步,又加上事務,微信轉賬方法還是無法開啓新的事務,原來是在同一個service裏面,於是改代碼,
這次又有新的bug
“Lock wait timeout exceeded; try restarting transaction”
原來是主方法跟微信轉賬方法有同一個sql,主方法沒有提交事務,導致子方法等待超時,於是去掉主方法的sql,最後終於成功了
總結:
1.全局事物導致自己配置的事務不生效
2.同一個service調用不生效
3.主方法跟子方法不能對同一條數據操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章