為何Mysql資料庫上讀和程式碼讀取的資料不一致
阿新 • • 發佈:2021-09-06
上週,做了一個同步刪除的功能,具體流程是,資料庫刪除-->呼叫第三方執行刪除介面,同步刪除。
具體流程
- 資料庫刪除資料後,這裡使用標誌刪除,再呼叫第三方資料。
- 在呼叫第三方資料之前需要通過id查詢資料,但是資料庫查不到資料,把控制檯答應的sql語句放在mysql執行,能查到資料。
- 在mysql上查的資料和程式碼上查的資料不一致。
分析原因
細心的讀者應該知道了,明明前面資料已經被刪了,後面就查不到了。但是當時業務邏輯比較多,本地刪除封裝了一個方法。第三方刪除又是在另外一個類裡面。所以後面就沒考慮到資料其實已經刪除了,所以後面是查不到的。
事務隔離級別
但是為什麼資料刪除了,在mysql中還能查的到呢,這就涉及到事務的隔離級別了。spring 事務預設的隔離級別是根據使用的資料庫來的,這裡使用的mysql,預設隔離級別是可重複讀(REPEATABLE_READ)
由於事務還沒執行完,別的sql是讀取不到改事務的資料改變。所以在用sql 執行 sql 是可以找到的資料的。
總結
資料庫上讀和程式碼上讀取資料不一致,本質上是由於兩個讀取不是在同一個事務下,而不在一個事務下,使用不同的事務隔離級別,導致讀取的資料也就不一致了。