1. 程式人生 > >Spring事務管理(一)什麼是事務?

Spring事務管理(一)什麼是事務?

我們在實際業務場景中,經常會遇到資料頻繁修改讀取的問題。在同一時刻,不同的業務邏輯對同一個表資料進行修改,這種衝突很可能造成資料不可挽回的錯亂,所以我們需要用事務來對資料進行管理。

1. 事務的概念

事務必須服從ACID原則。ACID指的是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)。
通俗理解,事務其實就是一系列指令的集合。
  • 原子性:操作這些指令時,要麼全部執行成功,要麼全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,資料進行回滾,回到執行指令前的資料狀態。
  • 一致性:事務的執行使資料從一個狀態轉換為另一個狀態,但是對於整個資料的完整性保持穩定。
  • 隔離性:在該事務執行的過程中,無論發生的任何資料的改變都應該只存在於該事務之中,對外界不存在任何影響。只有在事務確定正確提交之後,才會顯示該事務對資料的改變。其他事務才能獲取到這些改變後的資料。
  • 永續性:當事務正確完成後,它對於資料的改變是永久性的。

2. 併發事務導致的問題

在許多事務處理同一個資料時,如果沒有采取有效的隔離機制,那麼併發處理資料時,會帶來一些的問題。
  • 第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新資料覆蓋。

    小明去銀行櫃檯存錢,他的賬戶裡原來的餘額為100元,現在打算存入100元。在他存錢的過程中,銀行年費扣了5元,餘額只剩95元。突然他又想著這100元要用來請女朋友看電影吃飯,不打算存了。在他撤回存錢操作後,餘額依然為他存錢之前的100元。所以那5塊錢到底扣了誰的?

  • 髒讀:一個事務讀取到另一個事務未提交的更新資料。

    小明的銀行卡餘額裡有100元。現在他打算用手機點一個外賣飲料,需要付款10元。但是這個時候,他的女朋友看中了一件衣服95元,她正在使用小明的銀行卡付款。於是小明在付款的時候,程式後臺讀取到他的餘額只有5塊錢了,根本不夠10元,所以系統拒絕了他的交易,告訴餘額不足。但是小明的女朋友最後因為密碼錯誤,無法進行交易。小明非常鬱悶,明明銀行卡里還有100元,怎麼會餘額不足呢?(他女朋友更鬱悶。。。)

  • 幻讀也叫虛讀:一個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些行已經被刪除的資料,造成兩次結果不一致,只是另一個事務在這兩次查詢中間插入或刪除了資料造成的。

    公司財務A在進行員工薪資核算業務,需要對小明的工資進行計算並錄入系統,必須查詢兩次明細資訊,然後將後一次的明細資訊計算總數出來。財務在第一次明細查詢時,基本工資2000元,全勤獎1000元,提成2000元,共計5000元。在進行第二次計算時,財務B突然接到通知,需要把下個月的節日福利也在這個月的工資中發放,每人100元。於是財務B在每個人的工資明細中又加了一條節日福利100元。而此時財務A獲得第二次查詢小明的工資明細後,發現工資明細變成了4條資料,總數是5100元。兩次計算結果相差100元,財務A奇怪這多出來的一條明細100元是哪裡來的呢?(都怪財務B不告訴A。。。)

  • 不可重複讀:一個事務兩次讀取同一行的資料,結果得到不同狀態的結果,中間正好另一個事務更新了該資料,兩次結果相異,不可被信任。

    小明在手機上購買起購價為1W元理財產品。系統首先要判斷他的餘額夠不夠購買理財產品,如果足夠再獲取當前的餘額,進行申請。系統第一次讀取到小明的餘額還剩1W元,剛好足夠購買產品。但是這個時候剛好他女朋友又看中了一個包包5000元,這次密碼終於不會再錯誤的女朋友毫不猶豫刷了小明的銀行卡買下了這個包包。但是這個系統剛好在進行第二次確認,發現小明的餘額上只有5000元,根本不夠購買。於是系統很生氣,拒絕了小明的購買行為,告訴他,你真是個騙子!!!

  • 第二類丟失更新:是不可重複讀的特殊情況。如果兩個事物都讀取同一行,然後兩個都進行寫操作,並提交,第一個事物所做的改變就會丟失。

    小明和女朋友一起去逛街。女朋友看中了一支口紅,(對,女朋友就是用來表現買買買的)小明大方的掏出了自己的銀行卡,告訴女朋友:親愛的,隨便刷,隨便買,我坐著等你。然後小明就坐在商城座椅上玩手機,等著女朋友。這個時候,程式設計師的聊天群裡有人推薦了一本書,小明一看,哎呀,真是本好書,還是限量發行呢,我一定更要買到。於是小明趕緊找到購買渠道,進行付款操作。而同時,小明的女朋友也在不亦樂乎的買買買,他們同時進行了一筆交易操作,但是這個時候銀行系統出了問題,當他們都付款成功後,卻發現,銀行只扣了小明的買書錢,卻沒有扣去女朋友此時交易的錢。哈哈哈,小明真是太開心了!

下一章,將記錄Spring中的事務管控相關。