天天看點

事務管理--《資料庫系統概念》

術語'事務'指的是構成單一邏輯工作單元的操作的集合。資料庫的yiwai事務管理部件使得應用程式開發人員能夠把注意力集中在單個事務上,而不必考慮并發和容錯等問題。

事務概念

ACID:

  • 原子性(Atomicity):事務的所有操作要麼全部執行成功,要麼全部執行失敗
  • 一緻性(Consistency):隔離執行事務時(換言之,在沒有事務并發執行的情況下)保持資料庫的一緻性。
  • 隔離性(Isolation):盡管多個事務并發執行,但系統保證,對于任何一對事務$Ti$和$Tj$,在$Ti$看來,$Tj$要麼在$Ti$之前已經開始完成,要麼在$Ti$之後開始執行。是以,每個事務都感覺不到系統中有其他事務并發執行。
  • 持久性(Durability):一個事務完成後,它對資料庫的改變必須是永久的,即使系統出現故障

排程

事務的執行順序稱之為排程。

當資料庫系統并發執行多個事務時,相應的排程不必是串行的。若有兩個并發執行的事務,作業系統可能先選擇執行其中一個事務的一小段時間,然後切換上下文,執行第二個事務一段時間,接着又切回第一個事務執行一段時間,如此下去。

可串行化

在并發執行中,通過保證所執行的任何排程的效果都與沒有并發執行的效果一樣,我們可以確定資料庫的一緻性。也就是說排程應該在某種意義上等價一個串行排程。這種排程成為可串行化。

沖突

當$I$與$J$是不同僚務在相同的資料項上的操作指令,并且其中至少有一個是Write指令時,我們說$I$與$J$是沖突的。

等價

設$I$與$J$是排程$S$的兩條連續指令。若$I$與$J$是屬于不同僚務的指令且不沖突,則可以交換$I$與$J$的順序得到一個新的排程$S'$。$S$與$S'$等價,因為除了$I$與$J$以外,其他指令的次序與原來相同,而$I$與$J$的順序無關緊要。

沖突等價

如果排程$S$可以經過一系列非沖突指令交換轉換成$S'$,我們稱$S$與$S'$是沖突等價的。

沖突可串行化

若一個排程$S$與一個串行排程沖突等價,則稱排程$S$是沖突可串行化。

排程$S$是否為沖突可串行的,判斷其優先圖中是否有環,有環則不是沖突可串行的,反之沖突可串行
  • 在$Tj$執行$Read(Q)$之前,$Ti$執行$Write(Q)$。
  • 在$Tj$執行$Write(Q)$之前,$Ti$執行$Read(Q)$。
  • 在$Tj$執行$Write(Q)$之前,$Ti$執行$Write(Q)$。

    如果在優先圖中存在邊$Ti-->Tj$,則在任何等價$S$的串行排程$S'$中,$Ti$必出現在$Tj$之前。

    事務管理--《資料庫系統概念》
    事務管理--《資料庫系統概念》

事務的隔離性和原子性

事務隔離性級别

  • 可串行化:顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出

    現讀寫鎖沖突的時候,後通路的事務必須等前一個事務執行完成,才能繼續執行。

  • 可重複讀:會出現幻讀,在可重複讀中,該sql第一次讀取到資料後,就将這些資料加鎖(悲觀鎖),其它事務無法修改這些資料,就可以實作可重複讀了。

    但這種方法卻無法鎖住insert的資料,是以當事務A先前讀取了資料,或者修改了全部資料,事務B還是可以insert資料送出,這時事務A就會發現莫名其妙多了一條之前沒有的資料,這就是幻讀。

    但是MySQL、ORACLE、PostgreSQL等成熟的資料庫,出于性能考慮,都是使用了以樂觀鎖為理論基礎的MVCC(多版本并發控制)來實作,通過間隙鎖(next-key locking)政策防止幻讀的出現。

  • 不可重複讀/已送出讀:隻允許讀取已送出資料,但不要求可重複讀。比如,在事務兩次讀取一個資料項期間,另一個事務更新了該資料項并送出。
  • 未送出讀:允許讀取未送出的資料。這是SQL允許的最低一緻性級别。會産生“髒讀”

    以上所有隔離性級别均不允許“髒寫”,即如果一個資料項已經被另一個尚未送出或中止的事務寫入,則不允許對該資料項執行寫入操作。

繼續閱讀