Mysql隔離級別

2021-06-22 03:35:42 字數 1877 閱讀 1134

先記錄下幾個概念:

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

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

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

四種隔離級別:

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...