BUG記錄-多線程對事務的影響有多麼大?

問題描述

有一天,測試妹子W向我提了一個BUG,問題描述如下,當操作動作D時,動作D可以看作更新,更新我當前選擇的那一條數據,妹子W看到操作D成功頁面中多出一條一樣的數據,期望的結果是隻會更新當前選擇行的數據,並不會新增多餘的數據。

問題原因

開始的時候,我認爲代碼有問題,查看一下代碼,應該沒有太大的問題,普通操作動作D時,數據會更新,不會新增多餘的數據,但是在出現異常時,這個問題,就會復現出來,我當前猜想應該有事務有關係。

現在我先說明一下,動作D的業務邏輯,當我們點擊動作D時,首先會調用更新操作,更新數據,此處的更新爲先刪除原先的數據,後重新插入數據,更新結束後,繼續向下執行其它邏輯。在我Debug的時候,發現在刪除的邏輯上事務有回滾,唯一的是插入數據竟沒有回滾,我以爲是Mybatis plus有什麼特殊的騷操作,原諒當時無知的我,我在Google上找了好多文章就是沒找到這個問題產生的原因。最後,只能把這個BUG先放一邊,忙着修復其它Bug。

當我把所有的事情都忙完了,我又重新看了動作D的邏輯,看到插入的邏輯,這個插入數據的邏輯我是直接調用同事寫好的方法,我看到產生BUG的原因,因爲插入的數據有可能有許多,那段的邏輯使用了多線程插入數據。多線程影響事務回滾,事務沒辦法回滾多線程的數據。

解決步驟

發現問題後,當然要解決問題,多線程影響事務回滾,那我就用最笨的方法,重新寫一段插入數據的邏輯,解決這個事務問題。寫完代碼本地測試,當出現異常時,刪除操作回滾數據,新增操作回滾數據,解決完問題,發到測試環境讓妹子W再測試一遍,美滋滋!

總結

這個問題,浪費了我許多時間,上網找資料,還有掉頭髮,最後才發現問題的原因,事實說明我平時粗心大意,沒有看清楚代碼的邏輯,遇到問題首先不是看代碼,而是上網找解決方法。這個壞習慣影響着我,以後的工作中應該避免這類事情的出現。還有一個問題,就是使用別人的代碼一定要看中間的邏輯,別人使用沒有問題,並不代表你使用那部分代碼也沒有問題,所以工作中要仔細。

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