java事務的概念

背景

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

1. 事務的概念

事務必須服從ACID原則。ACID指的是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。
通俗理解,事務其實就是一系列指令的集合。

原子性:操作這些指令時,要么全部執(zhí)行成功,要么全部不執(zhí)行。只要其中一個指令執(zhí)行失敗,所有的指令都執(zhí)行失敗,數據進行回滾,回到執(zhí)行指令前的數據狀態(tài)。
一致性:事務的執(zhí)行使數據從一個狀態(tài)轉換為另一個狀態(tài),但是對于整個數據的完整性保持穩(wěn)定。
隔離性:在該事務執(zhí)行的過程中,無論發(fā)生的任何數據的改變都應該只存在于該事務之中,對外界不存在任何影響。只有在事務確定正確提交之后,才會顯示該事務對數據的改變。其他事務才能獲取到這些改變后的數據。
持久性:當事務正確完成后,它對于數據的改變是永久性的。

2. 并發(fā)事務導致的問題

在許多事務處理同一個數據時,如果沒有采取有效的隔離機制,那么并發(fā)處理數據時,會帶來一些的問題。

第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新數據覆蓋。

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

臟讀:一個事務讀取到另一個事務未提交的更新數據。

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

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

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

不可重復讀:一個事務兩次讀取同一行的數據,結果得到不同狀態(tài)的結果,中間正好另一個事務更新了該數據,兩次結果相異,不可被信任。

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

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

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 月光灑落下來 在這個城市耀眼的霓虹上 多少冰涼的高樓里 充斥著這個世界光怪陸離的現(xiàn)實 黑夜里那條疲憊不堪的街道 是...
    軒殤公子閱讀 287評論 1 5
  • 感恩分享209天 【踐行玖零 知行合一】 【反躬自省 反求諸己 【反觀內視 正己化人】 【日日知非 日日改過】 【...
    LILIYA_d19c閱讀 346評論 0 0
  • 高考"最后兩個月,覺得在學校效率不高,為了請假在家跟著樂學高考自學,故意找人打了一架,結果被勒令退學,順利回家自學...
    別看名字看內容閱讀 549評論 0 2

友情鏈接更多精彩內容