先記錄下幾個概念:
髒讀:在當前事務中,讀取到其他事務中還未提交的數據
不可重複讀:在當前事務中,讀取某一行的數據,可能讀出的數據不同
幻讀:在當前事務中,讀取記錄時,另外的事務插入了新的記錄,當前事務可能出現新的行。
四種隔離級別:
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';