資料庫事物相關問題

Iwanna發表於2020-09-20

四大特性

  1. 原子性
    事物中的操作要麼都成功,要麼都回滾
  2. 一致性
    執行事物前後的狀態要一致(都是從同一個狀態變到了另外的同一個狀態)
  3. 隔離性
    事物A和事物B的操作互不干擾
  4. 永續性
    事物產生的結果要永久的儲存在資料庫

隔離級別

以下都是在有多個事物的情況下才會發生
我們假設有A、B兩個事物

  1. 讀未提交
    A修改了內容,但是還沒有提交,B就能讀到了

    這裡就產生了髒讀

  2. 讀提交
    A修改了內容,在沒有提交前B只能看到A修改前的內容資料狀態

    這裡就出現了不可重複讀
    B先讀取到id=5內容此時B事物還在繼續,然後A修改了id=5的資料且提交了,此時未結束的B事物又去讀id=5的資料,發現資料不一樣了

  3. 可重複讀
    可重複讀就是為了解決上一條裡面的不可重複讀的問題
    解決方案是事物開始前就已經把內容先存了快照,確保事物結束前後讀取到的內容不會受其他事物的影響

    這裡就會產生幻讀
    A 選中了id > 3 and id < 10 的內容事物還在繼續(假設此時id = 5,7,8的資料,在資料庫是不存在的),然後B插入了一條 id = 5 的資料然後提交了,A由於是讀的快照裡面的內容,他依然以為id=5的資料不存在,此時A又去插入id=5的資料,資料庫就會報主鍵衝突的錯,此時A再次查詢id > 3 and id < 10 ,卻還是依然還看到id=5的資料

  4. 序列化
    A事物處理完了才能處理B事物

    解決了幻讀,因為不存在併發了,但也降低了效能

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章