先記錄下幾個概念:
髒讀:在當前事務中,讀取到其他事務中還未提交的資料
不可重複讀:在當前事務中,讀取某一行的資料,可能讀出的資料不同
幻讀:在當前事務中,讀取記錄時,另外的事務插入了新的記錄,當前事務可能出現新的行。
四種隔離級別:
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';
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
mysql隔離級別驗證 mysql 隔離級別測試
1 設定隔離級別,包括 全域性 global.tx isolation,會話級別 session.tx isolation mysql workbench的會話 2 建立測試表 注意 unsigned auto increment primary key用法 預設引擎的設定 建立測試表 use te...
Mysql 隔離級別
此隔離級別中,事務的修改對其他的事務也是可見的,事務可以讀取未提交的資料,也稱為髒讀 dirty read 很少使用此級別。大多數資料庫系統預設使用該隔離級別 mysql不是 此隔離級別中事務從開始到提交資料之前,所有的操作對於其他事物都是不見的,也稱作不可重複讀 nonrepeatable 造成2...