標籤:
這篇文章主要談談Mysql交易隔離等級的區別,以及自己的一些感受。
自己一直以來沒搞懂“可重複讀”和可提交讀“兩者之間的區別,通過此次的實踐,清楚了兩者之間的區別。廢話不說,先看看這幾個交易隔離等級。
Mysql資料庫總共分為四個交易隔離等級,其中預設的交易隔離等級是:repeatable read,而與其它的資料庫不同的是,其它的資料庫預設交易隔離等級是read committed(SQL Server、Oracle)。
第一步:SERIALIZABLE
Instance 1:
Instance 2:
可以看到,第二個事務會被BLOCK住,一致顯示正在執行中,最終會顯示逾時。
總結:SERIALIZABLE的交易隔離等級是:在一個事務沒有執行完畢之前,第二個事務是無法繼續執行的;這也與SERIALIZABLE是順序執行事務這一點相吻合。
第二步:REPEATABLE READ
Instance 1:
Instance 2:
可以看到,在將資料庫交易隔離等級設定為REPEATABLE READ之後,第一個事務在執行插入並提交之後,第二個事務並沒有查詢到插入的記錄。這就是資料庫中的“幻讀”現象,但是在SERIALIZABLE層級下就不會出現這種現象。
總結:REPEATABLE READ層級並沒有SERIALIZABLE層級隔離程度高,會導致“幻讀”現象。
第三步:READ COMMITTED
Instance 1:
Instance 2:
可以看到,在第一個事務插入一條記錄並且提交之後,在第二個事務中能看到插入的記錄。
總結:READ COMMITTED顧名思義,可以讀到已經提交的資料,但這也會造成同一個使用者運行同一個語句兩次,可能會得到不同的結果。
第四步:READ UNCOMMITTED
Instance 1:
Instance 2:
可以看到,READ UNCOMMITTED層級甚至可以讀取到未提交的資料,這是相當危險的!如果事務由於其它原因復原了,就會讀取到已經棄用的資料。
總結:READ UNCOMMITTED是四個交易隔離等級中最低的,可以讀取到未提交的資料。
開放學習:四個交易隔離等級的效能應當是:serializable<repeatable read<read committed<read uncommitted,這個有待於以後實際測試。
Mysql交易隔離等級學習