1. 程式人生 > >資料庫的事物和隔離級別

資料庫的事物和隔離級別

事物的特性

 1. 原子性(Atomicity):事務中包含的所有操作,要麼一次性完成,要麼失敗後,全部回滾。
 2. 一致性(Consistency):事務提交前和事務提交後,都必須是一致的。
 3. 隔離性(Isolation):事務與事務之間是隔離的,多個併發事務不能互相影響。
 4. 永續性(Durability):事務一旦提交後,對資料的更改是永久性的。

資料庫的隔離級別

用買票來說明,例如:A和B兩人去買票。
 1. 讀未提交(read uncommited) 
     會出現:髒讀、不可重複讀、幻讀。
     因為寫事物可以阻止其他寫事物,但是無法阻止讀事物,因此會出現髒讀,即一個事務讀取了其他事務修改但未提交的資料,有可能這個資料是錯誤,這就出現了讀髒資料。
    解決方案:如果在第一個事務提交前,任何其他事務不可讀取其修改過的值,則可以避免該問題。

 2. 讀取已提交(read commited)
     會出現:不可重複讀,幻讀;解決:髒讀。
     因為寫事務會阻止其他寫事務,讀事務不會阻止其他任務事務,因為只能讀取其他事務已經提交的,因此不會讀取到髒資料,但是會出現不可重複讀,即同一個事務中同樣條件下讀取資料,有可能出現數據不一致的情況,**不可重複讀主要是針對同一條記錄被其他事務修改**。   
     例如:A查詢某場電影剩餘3張票,但是當A準備買2張電影票的時候,發現票不夠了,因此時有其他事務買了2張票,導致修改後的結果不滿足A的需求。
    解決方案:如果只有在修改事務完全提交之後才可以讀取資料,則可以避免該問題。

3. 可重複讀(Repeatable read)
    會出現:幻讀,解決:不可重複讀,髒讀。
    可重複讀能夠保證同一事務內,多次讀取同一條資料,保證該條資料的一致性,但是無法避免幻讀,**幻讀主要是針對新增\刪除的記錄符合查詢的條件**。
    例如:A查詢剩餘票數大於3張的電影,第一次查詢發現有3場電影,但是第二次查詢發現有4場電影,因為在第二次查詢前,影院又添加了一場電影,因此第二次讀取的時候,會有4場電影。給A的印象,就好像第4場電影是虛幻出來的一樣。
        解決方案:如果在操作事務完成資料處理之前,任何其他事務都不可以新增新資料,則可避免該問題。

4. 可序列化(serializable)
    解決:髒讀、不可重複讀、幻讀。
強制事務序列執行,通過大量加鎖,解決幻讀,但是對效能影響極大