-
對于同時(shí)運(yùn)行的多個(gè)事務(wù),當(dāng)這些事務(wù)訪問數(shù)據(jù)庫相同的數(shù)據(jù)時(shí),如果沒有采取必要的隔離機(jī)制,就會(huì)導(dǎo)致各種并發(fā)問題:
臟讀:對于兩個(gè)事務(wù)T1权均,T2芽唇,T1讀取了已經(jīng)被T2更新但還沒有被提交的字段庶诡。之后,若T2回滾,T1讀取的內(nèi)容就是臨時(shí)且無效的。
不可重復(fù)讀:對于兩個(gè)事務(wù)T1,T2,T1讀取了一個(gè)字段榨惰,然后T2更新了該字段侠碧。之后, T1再次讀取同一個(gè)字段贸典,T1再次讀取同一個(gè)字段,值就不同了。
幻讀:對于兩個(gè)事務(wù)T1,T2,T1從一個(gè)表種讀取一個(gè)字段彻消,然后T2在該表種插入了一些新的行谢澈,如果T1再次讀取同一個(gè)表,就會(huì)多出幾行敬鬓。
-
數(shù)據(jù)庫事務(wù)的隔離性:數(shù)據(jù)庫系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個(gè)事務(wù)的能力础芍,使他們不會(huì)互相影響仑性,避免各種并發(fā)問題豹储。
-
數(shù)據(jù)庫提供的4種事務(wù)隔離級別:
隔離級別 | 描述 |
---|---|
READ UNCOMMTTED(讀未提交的數(shù)據(jù)) | 允許事務(wù)讀取未被其他是位于提交的變更慨灭、臟讀语稠,不可重復(fù)讀和幻讀的問題都會(huì)出現(xiàn) |
READ COMMITED(讀已提交數(shù)據(jù)) | 只允許事務(wù)讀取已經(jīng)被其他事務(wù)提交的變更慨畸,可以避免臟讀莱坎,但不可重讀和幻讀問題仍然會(huì)出現(xiàn) |
REPEATABLE READ(可重復(fù)讀) | 確保事務(wù)可以多次從一個(gè)字段中讀取相同的值,在這個(gè)事務(wù)持續(xù)期間寸士,禁止其他事務(wù)對這個(gè)字段進(jìn)行更新檐什,可避免臟讀和不可重復(fù)讀,但幻讀的問題仍然存在弱卡。 |
SERIALLIZABLE(串行化) | 確保事務(wù)可以從一個(gè)表種讀取相同的行乃正,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對該表執(zhí)行插入谐宙,更新和刪除操作,所有并發(fā)問題都可以避免界弧,但性能十分低下凡蜻。 |
-
Oracle支持2種事務(wù)隔離級別:READ UNCOMMTTED,SERIALLIZABLE搭综。Oracle默認(rèn)的事務(wù)隔離級別為:READ UNCOMMTTED
-
Mysql支持4種事務(wù)隔級別,Mysql默認(rèn)事務(wù)隔離級別為:READ UNCOMMTTED
-
每啟動(dòng)一個(gè)mysql程序划栓,就會(huì)獲得一個(gè)單獨(dú)的數(shù)據(jù)庫連接兑巾。每個(gè)數(shù)據(jù)庫連接都有一個(gè)全局變量@@tx_isolation,表示當(dāng)前的事務(wù)的隔離級別忠荞。
-
查看當(dāng)前隔離級別:SELECT @@tx_isolation;
-
設(shè)置當(dāng)前Mysql連接的隔離級別
*set transaction isolation level read committed;
-
設(shè)置數(shù)據(jù)庫的全局的隔離級別:
*set global transaction isolation level read committed;