欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql數(shù)據(jù)庫隔離級別詳解

 更新時間:2022年06月16日 09:48:18   作者:songtaiwu  
SQL標(biāo)準(zhǔn)定義了4類隔離級別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的,下面這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫隔離級別的相關(guān)資料,需要的朋友可以參考下

隔離級別

一、mysql有四個事務(wù)隔離級別

每個級別都有字符或數(shù)字編號

  1. 讀未提交 READ UNCOMMITTED | 0 : 存在臟讀,不可重復(fù)度,幻讀的問題。 
  2. 讀已提交 READ COMMITTED | 1 : 解決臟讀問題,存在不可重復(fù)讀,幻讀的問題。
  3. 可重復(fù)讀 REPEATABLE READ | 2 : 解決臟讀,不可重復(fù)讀的問題,存在幻讀,默認(rèn)隔離級別,使用MVCC機(jī)制實現(xiàn)可重復(fù)讀。
  4. 序列化 SERIALIZABLE | 3 : 解決臟讀,不可重復(fù)讀,幻讀,可保證事務(wù)安全,但完全串行執(zhí)行,性能最低。

我有記憶方法,先是RU、RC, 記住UC順序,聯(lián)想到UC WEB。

二、為什么默認(rèn)RR隔離級別?

RR級別作為mysql事務(wù)默認(rèn)隔離級別,是事務(wù)完全和性能的折中。SERIALIZABLE級別是悲觀地認(rèn)為幻讀時刻都會發(fā)生,故會自動地隱式地對事務(wù)所需資源加排他鎖,其他事務(wù)訪問此資源會被阻塞等待,故事務(wù)是安全的,但需要認(rèn)值考慮性能。

三、RR隔離級別下手動加鎖解決幻讀理論基礎(chǔ)

InnoDB的行鎖鎖定的是索引,而不是記錄本身。索引映射的記錄存在就加行鎖,如果不存在則會加next-key lock/gap鎖/間隙鎖, 故InnoDB可以實現(xiàn)事務(wù)對某記錄的預(yù)先占用。

臟讀、不可重復(fù)讀、幻讀 及其解決方法

臟讀

  • 一個事務(wù)讀取到另一個事務(wù)還沒有提交的數(shù)據(jù)。解決方法:把事務(wù)隔離級別調(diào)整到READ COMMITTED。

不可重復(fù)讀

  • 一個事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,我們稱之為不可重復(fù)讀。解決方法:把事務(wù)隔離級別調(diào)整到REPEATABLE READ。

幻讀

  • 網(wǎng)上很多文章都說一個事務(wù)執(zhí)行范圍查詢,兩次select得到的條數(shù)不同,就叫幻讀,這是錯誤的?。?!
  • 幻讀并不是說兩次讀取獲取的結(jié)果集不同,幻讀是指某一次select操作得到的結(jié)果所表征的數(shù)據(jù)狀態(tài)無法支持后續(xù)的業(yè)務(wù)操作,具體例子:select某記錄是否存在,不存在,準(zhǔn)備插入此記錄,但執(zhí)行insert時發(fā)現(xiàn)此記錄已存在,無法插入,此時就發(fā)生了幻讀。
  • 還一種理解思路,就是因為先采用了"快照讀",然后又用了"當(dāng)前讀",發(fā)現(xiàn)結(jié)果不同。比如先select是快照讀,然后update、insert等,這時會用到當(dāng)前讀,發(fā)現(xiàn)操作出現(xiàn)未預(yù)料結(jié)果。

幻讀解決方法

1、把事務(wù)隔離級別調(diào)整到SERIALIZABLE。2、RR隔離級別下,對select操作手動加行鎖,select ... for update,這也序列化隔離級別下隱式會做的事。

參考文章

幻讀  http://www.dbjr.com.cn/article/251790.htm

事務(wù)隔離級別命令行操作

1、查看隔離級別

1)查看當(dāng)前會話隔離級別

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

2)查看系統(tǒng)隔離級別

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED      |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

2、設(shè)置隔離級別

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

1)設(shè)置當(dāng)前會話

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

2)設(shè)置系統(tǒng)

mysql> set global transaction isolation  level read uncommitted;                
Query OK, 0 rows affected (0.00 sec)3、命令行,開始事務(wù)時用

操作驗證

自己在命令行去驗證幾種隔離級別下的讀問題。

一、實現(xiàn)臟讀

在不可提交讀, 也就是READ UNCOMMITED情況下,會產(chǎn)生臟讀。

二、操作驗證--實現(xiàn)不可重復(fù)讀

在可提交讀, 也就是READ COMMITED情況下,會產(chǎn)生不可重復(fù)讀。

三、操作驗證--解決不可重復(fù)讀

repeatable read(MySQL默認(rèn)隔離級別),這時候能解決可重復(fù)讀。

右邊事務(wù)提交了,修改了age=29,左邊再次查詢,還是28。

四、操作驗證--實現(xiàn)幻讀

repeatable read(MySQL默認(rèn)隔離級別),這時候還會出現(xiàn)幻讀。

總結(jié)

到此這篇關(guān)于mysql數(shù)據(jù)庫隔離級別文章就介紹到這了,更多相關(guān)mysql隔離級別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論