1. 程式人生 > >Spring事務的四種特性 事務的三種併發訪問問題真實場景解讀 事務的四種隔離級別 事務七種的傳播行為

Spring事務的四種特性 事務的三種併發訪問問題真實場景解讀 事務的四種隔離級別 事務七種的傳播行為

1.事務的基本特性(ACID)

  • 原子性:一個事務是一個整體,不可分割,事務中的操作要麼全部成功要麼全部失敗
  • 一致性:一致性和原子性描述的是同一件事情,原子性是從操作的角度來說,要麼全部成功要麼全部失敗,一致性是從資料的角度來說,資料要麼是事務提交前的狀態,要麼是事務全部完成的狀態.比如轉賬,初始狀態(1000,1000) 轉賬100.事務提交之後資料要麼是(1100,900)要麼是(1000,1000),不能出現(1000,900)的情況
  • 隔離性:在事務併發訪問中,事務之間互不影響
  • 永續性:事務一旦提交即生效,資料不會改變

 

2.事務併發訪問問題

  • 髒讀:一個事務讀到了另一個事務未提交的資料

(場景:A給B轉錢,轉錢之前B有1000塊錢,A這面開啟事務轉了100,還沒有提交,在B的事務裡就看到了自己的錢多了100塊錢,如果掛了電話A回滾了,B就懵逼了)

  • 不可重複讀:一個事務讀到了另一個事務已提交的update資料

(場景:A到銀行存錢,存錢之前查了一下卡還有10000塊錢,銀行給A存了10000塊錢,存完之後,A的老婆B在家裡在網上用這張卡消費了20000塊錢,並且提交了,這時在銀行的這個事務裡再次查詢卡里還有多少錢,這時還有0元,來銀行的時候卡里有10000塊錢,存完10000之後卡里還有0元了,A當場就躺地上了,這就是讀到了另一個事務已經提交的update語句)

(簡單記法:對於單條資料來說,讀了一次,在重複讀了一次就和上一次讀的資料不一致了,一重複讀就見鬼了,所以叫不可重複讀)

  • 虛幻讀:一個事務讀到了另一個事務已提交的insert/delete語句

(簡單記法:虛幻,想到近視眼看一個東西好像有兩三個重影,就對應著資料庫中insert/delete語句導致資料的條數不一樣了,所以叫虛幻讀)

 

3.事務的隔離級別:(解決事務的併發問題的)

  • 讀未提交:Read Uncommited 讀到了未提交的資料,對應著最低級別的髒讀還在發生,什麼問題都解決不了
  • 讀已提交:Read Committed 讀到了已經提交的資料,對應著不可重複讀還在發生,但是髒讀解決了(oracle資料庫的預設級別)
  • 可重複讀:Read Repeatable,可重複讀對應著解決了不可重複讀的問題,Mysql資料庫的預設級別
  • 序列化:Serializable 解決了所有問題,單執行緒,極端化,不能使用

 

4.事務的傳播行為:

事務往往在service層進行控制,如果service層的方法A呼叫了另一個Service層的方法B,A和B本身都已經被添加了事務了,那麼在A呼叫B的時候就要進行一些協商,這就叫做事務的傳播行為

.