Mysql隔離級別

先記錄下幾個概念:

髒讀:在當前事務中,讀取到其他事務中還未提交的數據

不可重複讀:在當前事務中,讀取某一行的數據,可能讀出的數據不同

幻讀:在當前事務中,讀取記錄時,另外的事務插入了新的記錄,當前事務可能出現新的行。


四種隔離級別:

1.未提交讀

可能讀到髒數據



會話A中的隔離級別爲未提交讀


表中原來的數據


會話B中,啓動一個實務,並且,修改其中一個數據


在會話A中可以看到提交之前的數據,即可以看到髒數據



在會話B中回滾之前的事務


會話A中查到回滾之後並未提交的數據。


2.提交讀,可以避免髒讀

可能發生不可重複讀


在會話A中啓動一個事務,查看全表的數據



在會話B中進行一個事務修改其中一個行



在會話A中可以看到這個變化


3.可重複讀 可以避免不可重複讀

但是可能出現幻讀

在mysql5.1中沒有發現幻讀,可能和不同的數據庫的實現有關(可能和MVCC有關)

4.可串行化 可以避免幻讀(將所有讀取的行都加了鎖)


MVCC:Multi-Version Concurrency Control 多版本併發控制

InnoDB的MVCC是通過沒行記錄後面保存兩個隱藏的列來實現的。

一個保存了行的創建時間,另一個保存了刪除時間。時間用版本號來記錄,每開始一個事務系統版本號就遞增。

REPEATABLE READ隔離等級下

INSERT 新插入和每一行保存當前系統版本號爲創建時間

DELETE 刪除的每一行保存當前系統版本號位刪除時間

UPDATE 插入一條新的數據,保存當前系統版本號作爲創建時間,同時保存當前系統版本號到原來的行作爲刪除時間

SELECT 查找早於當前事務版本號的行,並且要查找刪除版本號大於當前事務版本號的行。

(解釋了爲什麼插入新行沒有顯示)


附:mysql的一些基本操作

建表:create table 表名 (id int, num int) type=innodb;

查看錶類型:show create table 表名;

查看會話隔離級別:select  @@tx_isolation;

查看全集隔離級別: select @@global.tx_isolation;

修改會話隔離級別:set session tx_isolation='read-uncommitted';



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