springACID與隔離級別

事務的基本要素(ACID)

  •  原子性(Atomicity):事務不可分割,中間狀態不可中斷。
  • 一致性(Consistency):事務執行數據前後一致。比如A向B轉賬,不可能A扣了錢,B卻沒收到。
  • 隔離性(Isolation):一個事務不應該受到其他事務的干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。
  • 持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。

事務隔離級別

原因:併發事務導致的髒讀,不可重複讀,幻讀。

  • 髒讀:當前事務可以讀到另一個事務未提交的數據。
  • 不可重複讀:當前事務中,同一條sql,多次查詢前後結果內容不一致(側重於修改)。
  • 虛讀/幻讀:當前事務中,同一條sql,多次查詢,前後結果記錄數不一致,有可能多了,也有可能少了。 (側重於新增/刪除)。

髒讀和不可重複讀的區別:髒讀讀到的是未提交的數據,而不可重複讀讀到的是已經提交的數據。

不可重複讀和虛讀/幻讀的區別:不可重複讀側重於修改,虛讀/幻讀側重的是新增/刪除。

解決方法:通過事務隔離級別去解決,以下四個隔離級別需要對應的數據庫引擎自己支持,而不是spring本身去支持,spring只是整合使用而言。

Read committed (讀已提交) 當前事務可以讀到另一個事務提交後的數據。 可以避免髒讀,但不可重複讀和幻讀問題仍然可能出現。
Read uncommitted (讀未提交) 當前事務可以讀到另一個事務未提交的數據。 髒讀,不可重複讀,幻讀都可能會出現。
REPEATABLE_READ(可重複讀) 確保事務可以多次從一個字段中讀取相同的值。在這個事務持續期間,禁止其他事務對這個字段進行更新。 可以避免髒讀和不可重複讀,但是幻讀的問題依然存在。
Serializable(串行化) 確保事務可以從一個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入,更新,刪除。

所有的併發問題都能避免,但是性能比較低。

 

 

 

 

mysql支持四種隔離級別,默認採用repeatable_read

oracle只支持Read committed 和Serializable(串行化),默認Read committed。

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