mysql實(shí)戰(zhàn)技巧(二)mysql事務(wù)的隔離級(jí)別
隔離等級(jí)產(chǎn)生的問題

臟讀(Drity Read):A,B兩個(gè)事務(wù)同時(shí)操作表C,A事務(wù)修改C表但是未提交,但是此時(shí)B事務(wù)查詢會(huì)獲取到A事務(wù)修改后的數(shù)據(jù)。
不可重復(fù)讀(Non-repeatable read):A,B兩個(gè)事務(wù)同時(shí)操作表C成績(jī)字段,A事務(wù)第一次查詢成績(jī)?yōu)?0(A事務(wù)未結(jié)束),B事務(wù)修改成績(jī)?yōu)?0分,此時(shí)A事務(wù)再次查詢成績(jī)就為90分。兩次查詢結(jié)果不同。
幻讀(Phantom Read):A,B兩個(gè)事務(wù)操作C表,A查詢id為100分的數(shù)據(jù),得到null,此時(shí)B插入一條id為100數(shù)據(jù),提交,A再次插入id為100的數(shù)據(jù)發(fā)現(xiàn)數(shù)據(jù)已經(jīng)存在,A懵逼了,剛才我還沒有查到為什么不能插入。。。。。。
事務(wù)的隔離等級(jí)
未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會(huì)話中未提交事務(wù)修改的數(shù)據(jù)。
提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)。
可重復(fù)讀(Repeated Read):可重復(fù)讀。在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開始時(shí)刻一致的,InnoDB默認(rèn)級(jí)別。在SQL標(biāo)準(zhǔn)中,該隔離級(jí)別消除了不可重復(fù)讀,但是還存在幻讀。
串行化(Serializable):完全串行化的讀,每次讀都需要獲得表級(jí)共享鎖,讀寫相互都會(huì)阻塞,效率最低,可以避免臟讀,幻讀,不可重復(fù)讀。
這四種隔離等級(jí)從上向下依次變低
避免幻讀的方法
在第一次查詢之后,手動(dòng)加入鎖,不允許別人插入id為100的數(shù)據(jù)。
SELECT id FROM C WHERE id = 100 FOR UPDATE;
數(shù)據(jù)庫默認(rèn)的隔離等級(jí)
Mysql默認(rèn)的隔離等級(jí)?可重復(fù)讀。
oracle,SQL Server默認(rèn)為 提交讀。
查詢Mysql當(dāng)前隔離等級(jí)
1.查詢當(dāng)前會(huì)話和全局會(huì)話等級(jí)
SELECT @@global.tx_isolation, @@tx_isolation;
2.設(shè)置當(dāng)前會(huì)話隔離級(jí)別
set session transaction isolatin level (read uncommitted,read committed,repeatable read,serializable);
3.設(shè)置系統(tǒng)當(dāng)前隔離級(jí)別
set global transaction isolation level (read uncommitted,read committed,repeatable read,serializable);
MySQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。