資料庫事務整理

洞拐洞拐發表於2016-08-22

  1.首先是事務的概念:是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。舉個例子:比如銀行轉賬問題,A給B轉賬100塊錢,應該是要分為兩步操作,第一顯示A的餘額-100,再就是B的餘額+100,這兩個操作要麼都成功,要不都不能成功,這兩個操作是一個不可拆分的,也就是下面說的原子性。

  2.再就是事務的四大特性:原子性,一致性,隔離性,永續性。

  3.如果在沒有多執行緒控制機制的情況下,多個事務併發執行,會發生以下幾個問題:

    髒讀:A事務讀取資料庫的某條記錄,但是這條記錄是B事務更新未提交的,所以,A事務讀取的資料很可能因為B事務回滾而導致資料不正確。

    不可重複讀:A事務連續讀取資料庫的某條已被提交的記錄,但是B事務在A事務讀取的間隙又對該記錄更新並提交了,A事務讀取的多次資料就會不正確。

    幻讀:

  4.對於處理以上四種情況,有四個級別的處理方案:Read Uncommitted,Read Committed,Repeatable Read,serializable(讀未提交、讀已提交、可重複讀、序列化)

    Read UnCommitted:事務的各種問題均無法避免,因為資料庫允許某事物讀取未提交的資料。

    Read Committed: 可以防止髒讀,因為資料庫只允許事務讀取的時候讀取已提交的資料,因此資料庫不得不採用鎖,此級別鎖行。

    Repeatable Read:可以防止髒讀和不可重複讀問題,因為此級別下某事物讀取資料將會禁止寫資料的其他事務(但允許讀事務),寫事務則禁止任何其他事。

    Serializable: 最狠的一種,要求每個事務已序列化的方式進行執行,A事務不結束B事務不能開始,知道A事務完成才行。

    注意:四大隔離級別從上到下越來越安全,安全的代價就是效能,為了防止多執行緒事故,資料庫只能加鎖,這就限制了效能,而且還可能出現死鎖,所以

    選用隔離級別的候要小心選用。

  5.常見資料庫的隔離級別

    mysql具有四大隔離級別,預設為Read Committed,設定隔離級別語句為:

    SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

    Oracle中只有兩隔離級別:Read Committed和Serializable,預設為Read Committed。

相關文章