《Mysql學(xué)習(xí)MySQL數(shù)據(jù)庫事務(wù)隔離級別詳解》要點(diǎn):
本文介紹了Mysql學(xué)習(xí)MySQL數(shù)據(jù)庫事務(wù)隔離級別詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL學(xué)習(xí)數(shù)據(jù)庫事務(wù)隔離級別
MYSQL學(xué)習(xí)數(shù)據(jù)庫事務(wù)的隔離級別有4個,由低到高依次為
MYSQL學(xué)習(xí)這四個級別可以逐個辦理臟讀 、不可重復(fù)讀 、幻讀 這幾類問題.
MYSQL學(xué)習(xí)√: 可能出現(xiàn) ×: 不會出現(xiàn)
事務(wù)級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
MYSQL學(xué)習(xí)注意:我們討論隔離級別的場景,主要是在多個事務(wù)并發(fā)的情況下.
MYSQL學(xué)習(xí)臟讀、幻讀、不可重復(fù)讀
MYSQL學(xué)習(xí)臟讀:
MYSQL學(xué)習(xí)臟讀就是指當(dāng)一個事務(wù)正在拜訪數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也拜訪這個數(shù)據(jù),然后使用了這個數(shù)據(jù).
MYSQL學(xué)習(xí)不可重復(fù)讀:
MYSQL學(xué)習(xí)是指在一個事務(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)容)
MYSQL學(xué)習(xí)幻讀:
MYSQL學(xué)習(xí)是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行.同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù).那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣.
MYSQL學(xué)習(xí)example:
MYSQL學(xué)習(xí)表:
MYSQL學(xué)習(xí)
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;
MYSQL學(xué)習(xí)模擬數(shù)據(jù):
MYSQL學(xué)習(xí)
INSERT INTO `cc_wsyw126_user_test_isolation_copy` (`password`, `age`)
VALUES
('1', 1),
('2', 2),
('3', 3),
('4', 4);
MYSQL學(xué)習(xí)第一個事務(wù)A:
MYSQL學(xué)習(xí)
start transaction
insert into cc_wsyw126_user_test_isolation_copy (password, age) values ('5',5)
commit
MYSQL學(xué)習(xí)第二個事務(wù)B:
MYSQL學(xué)習(xí)
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
MYSQL學(xué)習(xí)重現(xiàn)步驟:
MYSQL學(xué)習(xí)只要A事務(wù)的insert語句,在B事務(wù)select之前和update之后即可.
MYSQL學(xué)習(xí)MySQL InnoDB存儲引擎,實(shí)現(xiàn)的是基于多版本的并發(fā)控制協(xié)議――MVCC (Multi-Version Concurrency Control) 加上間隙鎖(next-key locking)策略在Repeatable Read (RR)隔離級別下不存在幻讀.如果測試幻讀,在MyISAM下實(shí)驗(yàn).
MYSQL學(xué)習(xí)在聚集索引(主鍵索引)中,如果有唯一性約束,InnoDB會將默認(rèn)的next-key lock降級為record lock.
MYSQL學(xué)習(xí)感謝閱讀,希望能贊助到大家,謝謝大家對本站的支持!
歡迎參與《Mysql學(xué)習(xí)MySQL數(shù)據(jù)庫事務(wù)隔離級別詳解》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11535.html