MySQL事務隔離級別-髒讀,幻讀,不可重複讀

概述

名詞解釋

共享鎖(shared lock): 這種鎖允許事務對讀鎖定的對象進行讀取操作, 同時允許其他的事務也對這個對象施加共享鎖, 但是不能對鎖定的對象進行寫入, 共享鎖的反面是排它鎖.
排它鎖(exclusive lock): 一種可以防止其他事務鎖定同一行的鎖, 這種鎖可能會阻止其他事務寫入或者讀取鎖定的對象, 而InnoDB使用MVCC技術來實現對唄排它鎖鎖定的對象讀取來提高併發性.
一致性讀(consistent read): 利用快照snapshot信息來根據某個時間點來讀取數據, 而不管其他事務對該對象做了什麼操作, 如果其他的事務已經完成操作, 則會通過撤銷日誌(undo log)來重建數據.
鎖定讀: 在讀取的時候, 使用某種鎖鎖定需要讀取的數據.

# 使用共享鎖(Share Lock)鎖定
select * from t1 lock in share mode;
# 使用排它鎖(Exclusive Lock)鎖定
select * from t1 where id=1 lock for update;

非鎖定讀:

select * from t1 where id=1;

事務相關操作語句

# 查看當前MySQL數據庫版本
select version();
# 查看當前數據庫的隔離級別
SELECT @@tx_isolation;
# 設置隔離級別
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
  {
       READ UNCOMMITTED
     | READ COMMITTED
     | REPEATABLE READ
     | SERIALIZABLE
   }
# 開始事務
start transaction;
# begin也也是開啓一個事務
begin;
# 提交事務
commit;
# 回滾事務
rollback;

髒讀(Dirty Read):

現象

髒讀: 事務A在操作某行數據, 此時事務B開始讀取數據, 然後事務A回滾事務, 此時事務B讀取到的數據就是髒數據, 而事務B這種讀取到其他事務的中間數據的過程就是髒讀.
不可重複讀: 事務A在開啓事務後,兩次讀取同一行, 發現返回不同的數據, 這種在一個事務中兩次讀取到不同數據的情況就是不可重複讀.
幻讀: 事務A開始事務, 正在修改id爲1-50的數據, 當修改到40行時候, 再次讀取第一行數據, 發現第一行數據似乎沒有被修改, 其實它是在被事務A修改後又被其他事務改回來了, 似乎產生了幻覺, 這就是幻讀.

隔離級別

讀未提交(read uncommitted) 事務B能夠讀取到事務A還沒有提交的數據, 就是事務A未提交的中間數據能夠被事務B讀取到,
讀已提交: 事務B只能夠讀取到事務A提交前或者提交後的數據, 不能讀取到事務A未提交的中間數據.每次都會讀取其他事務最新提交的快照.
可重複讀: 事務B在還沒有提交前, 對鎖定的數據, 無論重複多少次讀取, 都是一樣的. 原因是在事務開始時候, 對對象採用了一致性讀取在該事務開始時候的快照.
可串行化: 整張表, 一個時刻只能有一個事務在操作.

隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read uncommitted)
讀已提交(read committed)
可重複讀(repeatable read)
可串行化(serializable)

參考

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