MySQL數(shù)據(jù)庫事務(wù)隔離級別詳解
數(shù)據(jù)庫事務(wù)隔離級別
數(shù)據(jù)庫事務(wù)的隔離級別有4個,由低到高依次為
- Read uncommitted:允許臟讀。
- Read committed: 防止臟讀,最常用的隔離級別,并且是大多數(shù)數(shù)據(jù)庫的默認(rèn)隔離級別。
- Repeatable read:可以防止臟讀和不可重復(fù)讀。
- Serializable:可以防止臟讀,不可重復(fù)讀取和幻讀,(事務(wù)串行化)會降低數(shù)據(jù)庫的效率。
這四個級別可以逐個解決臟讀 、不可重復(fù)讀 、幻讀 這幾類問題。
√: 可能出現(xiàn) ×: 不會出現(xiàn)
事務(wù)級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
注意:我們討論隔離級別的場景,主要是在多個事務(wù)并發(fā)的情況下。
臟讀、幻讀、不可重復(fù)讀
臟讀:
臟讀就是指當(dāng)一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。
不可重復(fù)讀:
是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時,另外一個事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改,那么第一個事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。(即不能讀到相同的數(shù)據(jù)內(nèi)容)
幻讀:
是指當(dāng)事務(wù)不是獨立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。
example:
表:
CREATE TABLE `cc_wsyw126_user_test_isolation_copy` ( `id` int(11) NOT NULL AUTO_INCREMENT, `password` varchar(64) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `ix_age` (`age`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
模擬數(shù)據(jù):
INSERT INTO `cc_wsyw126_user_test_isolation_copy` (`password`, `age`) VALUES ('1', 1), ('2', 2), ('3', 3), ('4', 4);
第一個事務(wù)A:
start transaction insert into cc_wsyw126_user_test_isolation_copy (password, age) values ('5',5) commit
第二個事務(wù)B:
start transaction update cc_wsyw126_user_test_isolation_copy set age = 2 where password >='2' select * from cc_wsyw126_user_test_isolation_copy where password >= '2'; commit
重現(xiàn)步驟:
只要A事務(wù)的insert語句,在B事務(wù)select之前和update之后即可。
MySQL InnoDB存儲引擎,實現(xiàn)的是基于多版本的并發(fā)控制協(xié)議——MVCC (Multi-Version Concurrency Control) 加上間隙鎖(next-key locking)策略在Repeatable Read (RR)隔離級別下不存在幻讀。如果測試幻讀,在MyISAM下實驗。
在聚集索引(主鍵索引)中,如果有唯一性約束,InnoDB會將默認(rèn)的next-key lock降級為record lock。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。