1. 程式人生 > 其它 >為何Mysql資料庫上讀和程式碼讀取的資料不一致

為何Mysql資料庫上讀和程式碼讀取的資料不一致

上週,做了一個同步刪除的功能,具體流程是,資料庫刪除-->呼叫第三方執行刪除介面,同步刪除。

具體流程

  • 資料庫刪除資料後,這裡使用標誌刪除,再呼叫第三方資料。
  • 在呼叫第三方資料之前需要通過id查詢資料,但是資料庫查不到資料,把控制檯答應的sql語句放在mysql執行,能查到資料。
  • 在mysql上查的資料和程式碼上查的資料不一致。

分析原因

細心的讀者應該知道了,明明前面資料已經被刪了,後面就查不到了。但是當時業務邏輯比較多,本地刪除封裝了一個方法。第三方刪除又是在另外一個類裡面。所以後面就沒考慮到資料其實已經刪除了,所以後面是查不到的。

事務隔離級別

但是為什麼資料刪除了,在mysql中還能查的到呢,這就涉及到事務的隔離級別了。spring 事務預設的隔離級別是根據使用的資料庫來的,這裡使用的mysql,預設隔離級別是可重複讀(REPEATABLE_READ)

由於事務還沒執行完,別的sql是讀取不到改事務的資料改變。所以在用sql 執行 sql 是可以找到的資料的。

總結

資料庫上讀和程式碼上讀取資料不一致,本質上是由於兩個讀取不是在同一個事務下,而不在一個事務下,使用不同的事務隔離級別,導致讀取的資料也就不一致了。