常見的數據庫事務隔離級別

爲什麼會出現數據庫的隔離級別呢?

數據庫隔離級別是爲了解決數據庫併發訪問過程中產生的各種數據安全問題.

事務的基本要素(ACID)

  1. 原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

  2. 一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

  3. 隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

  4. 持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。

事務的併發問題

  1. 髒讀 :讀到的數據是未確認的數據 ( 未提交 ) , 如果另一個客戶端在操作過程中,回滾了操作.那麼用戶讀到的數據其實是無效數據.
  2. 不可重複讀 :是指一個客戶端在同一個事務中多次讀取相同的數據 , 結果不一致
  3. 幻讀 :一個客戶端多次讀取相同的數據,每次得到的結果都跟第一次得到的數據一樣.但其實數據已經發生了變化.但是查不到結果.

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

四種事務隔離級別:

  1. 讀未提交 read uncommitted
  2. 讀已提交 read committed ( oracle默認 )
  3. 可重複讀 repeatable read ( mysql默認 )
  4. 串行事務 serializable

由事務隔離級別產生的幾個常見問題:

  1. 讀未提交,導致 ----->>>> 髒讀
  2. 讀已提交,導致 ----->>>> 不可重複讀
  3. 可重複讀,導致 ----->>>> 幻讀

在這裏插入圖片描述

  1. 查看當前會話隔離級別

select @@tx_isolation;

  1. 查看當前系統全局隔離級別

select @@global.tx_isolation;

設置當前會話隔離級別

  1. 設置讀未提交

set session transaction isolation level read uncommitted;

  1. 設置讀已提交

set session transaction isolation level read committed;

  1. 設置可重複讀

set session transaction isolation level repeatable read;

  1. 設置串行化 ( 讀寫不能併發 )

set session transaction isolation level serializable;

事務操作

  1. 開啓事務

start transaction;

  1. 提交事務

commit;

  1. 回滾事務

rollback;

如果此篇文章對你有幫助記得點贊 收藏 + 關注 ! 如有更好的建議或方法可以到 QQ羣交流哦:1101584918 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章