資料庫事務無非就兩種:讀取事物(select)、修改事物(update,insert)。
在沒有事物隔離控制的時候,多個事物在同一時刻對同一(資料的操作可能就會影響到最終期望的結果,通常有四種情況:
(1) 兩個更新事物同時修改一條資料時,很顯然這種情況是最嚴重的了,程式中無論如何也不能出現這種情況,因為它會造成更新的丟失!通俗的講,我更新時,你也更新這不就出問題了嗎,不行!
(2) 乙個更新事物更新一條資料時,另乙個資料讀取了還沒提交的更新,這種情況下會出現讀取到髒資料。通俗的講就是,你在我更新的時候讀取,我還沒提交你就讀,你讀到了髒資料!
(3) 乙個讀取事物讀取一條資料時另乙個更新事物修改了這條資料,這時就會出現不可重現的讀取。通俗的講,我在讀資料,你修改了,我讀了不一樣的資料。
(4)乙個讀取事物讀取時,另乙個插入事物(注意此處時插入,(3)中是更新同一條數椐,自己體會)插入了一條新資料,這樣就可能多讀出一條資料,出現幻讀。通俗的講,我讀取資料的時侯你插入新資料了,怪不得我多讀了一條呢。
以上四種情況描述完畢,相信大家也發現規律了,前三種是對同一條資料的併發操作,對程式的結果可能產生致命影響,尤其是金融等實時性,準確性要求極高的系統,絕不容許這三中情況的出現,相比第四種情況不會影響資料的真實性,在很多情況下是允許的,如社交論壇等實時性要求不高的系統!
綜上四個情況,我們可以大致這樣簡單的理解(最初說的兩種事物的自由組合2*2=4):
a) 修改時允許修改(丟失更新)b) 修改時允許讀取(髒讀)
c) 讀取時允許修改(不可重複讀)
d) 讀取時允許插入(幻讀)
從上到下問題越來越不嚴重,但所需的效能開銷卻越大。因為不同的系統允許不同級別的情況,所以就出現了事務隔離這麼乙個東東,來允許我們設定資料庫的並發行為。
其中1)讀取未提交, 這個級別就是乙個事物更新的時候不允許更新,但允許讀取,說以不會出現丟失更新,單會出現髒讀。隔離級別最低。
2)讀取已提交資料,就是乙個事物更新的時候不允許讀取,必須等到更新事物提交後才能讀取,不會出現髒讀,但可能出現不可重複度。隔離級別次低。
以上兩種級別是針對更新事物的限制,在讀取事物進行時,是不會有任何限制的。所以會出現不可重複讀(讀取時,有更新),和幻讀(讀取時,插入)。
3)可重現的讀取,就是乙個事物讀取時,不允許更新,但允許插入。不會出現不可重複讀,但會出現幻讀。
4)序列化(大招),只要有事物進行,其他事物必須等著該事務執行完,所以不會出現任何併發問題。
以上兩個事物會限制讀取事物的,所以隔離級別較高,但效能開銷不容小覷。
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...