問(wèn)題:當(dāng)A服務(wù)器開(kāi)啟事務(wù)時(shí),未提交京腥。B事務(wù)無(wú)法修改數(shù)據(jù)庫(kù)的內(nèi)容另伍,只能查看,能讀不能寫绞旅。
一摆尝、并發(fā)訪問(wèn)問(wèn)題----由隔離性引起
如果不考慮隔離性,事務(wù)存在3中并發(fā)訪問(wèn)問(wèn)題因悲。
1)臟讀:B事務(wù)讀取到了A事務(wù)尚未提交的數(shù)據(jù) ------ 要求B事務(wù)要讀取A事 務(wù)提交的數(shù)據(jù)堕汞。mysql的四個(gè)隔離級(jí)別中,只有“讀未提交read uncommitted”會(huì)出現(xiàn)你說(shuō)的情況晃琳,剩下三個(gè)隔離級(jí)別在本session中都不能看到其它session未提交的事務(wù)
2)不可重復(fù)讀:一個(gè)事務(wù)中 兩次讀取的數(shù)據(jù)的內(nèi)容不一致 ----- 要求的是一個(gè)事 務(wù)中多次讀取時(shí)數(shù)據(jù)是一致的 --- unpdate
3)幻讀/虛讀:一個(gè)事務(wù)中 兩次讀取的數(shù)據(jù)的數(shù)量不一致 ----- 要求在一個(gè)事務(wù)多 次讀取的數(shù)據(jù)的數(shù)量是一致的 --insert delete
2.事務(wù)的隔離級(jí)別
事務(wù)的建立 先后 影響很大
1)read uncommitted : 讀取尚未提交的數(shù)據(jù) :哪個(gè)問(wèn)題都不能解決
2)read committed:讀取已經(jīng)提交的數(shù)據(jù) :可以解決臟讀 ---- oracle默認(rèn)的
3)repeatable read:重讀讀妊都臁:可以解決臟讀 和 不可重復(fù)讀 ---mysql默認(rèn)的
(相當(dāng)于我在銀行取錢,查看賬戶還有1000卫旱,突然我女朋友在淘寶買衣服轉(zhuǎn)賬了500人灼,等我取錢,顯示余額不足)
4)serializable:序列化:可以解決 臟讀 不可重復(fù)讀 和 虛讀---相當(dāng)于鎖表
設(shè)置mysql的隔離級(jí)別:set session transaction isolation level 設(shè)置事務(wù)隔離級(jí)別 | |
注意:mysql數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別 :repeatable read
mysql語(yǔ)句:
設(shè)置事務(wù)隔離級(jí)別: set session transaction isolation level read uncommitted;
查看mysql數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別:select @@tx_isolation;
開(kāi)啟一個(gè)事務(wù):start transaction;
舉例理解:
臟讀:A B服務(wù)器設(shè)為 read uncommitted
我第一個(gè)服務(wù)器未提交投放,但是這第二個(gè)服務(wù)器能夠看到 我未提交的數(shù)據(jù),即為臟讀适贸。
一旦我設(shè)置為read committed 就不會(huì)出現(xiàn)這種情況灸芳。A服務(wù)器即使沒(méi)有提交,B服務(wù)器也看不到未提交的內(nèi)容拜姿。
隔離級(jí)別的性能:
read uncommitted>read committed>repeatable read>serialazable
安全性
read uncommitted<read committed<repeatable read<serialazable