MYSQL為什么要有事務?或者說,事務是用來解決什么問題的?


MYSQL為什么要有事務?或者說,事務是用來解決什么問題的?

舉一個最經典的樣例:

假設進行銀行轉賬,A的賬戶扣除50元,B的賬戶增加50元,對應的sql語句如下

update table set cost = cost - 50 where id = 'A';///step 1
update table set cost = cost + 50 where id = 'B';///step 2

這樣就實現了一次銀行轉賬,理論上是這樣沒錯,但在現實生活中會出現很多問題,例如我執行了第一條語句后,突然電腦藍屏了/死機了/斷電了/電腦被人砸爛了.....

總之出現了各種各樣的問題(被crash后),出現了一種情況:執行了第一條語句,但並沒有執行第二條語句

當電腦恢復重啟后,A發現他的賬戶少了,B的賬戶卻沒有變化,錢憑空消失了!

事務就是為了解決這一個問題——某些操作要么全部發生,要么全部不發生,不能發生一些,這就是數據庫的第一個特性——原子性


事務也被視作數據庫的最小工作單位

好理解,由於原子性——即事務內的操作要么全部發生,要么全部不發生;所以事務被視作一個單位量。

這樣的機制又衍生出了另一個問題:

當同一時間存在很多事務時,你不能確認哪些事務對數據的操作是正常的、正確的,即哪些事務不需要回滾。

有可能存在事務A讀取了事務B更新后的數據,但事務B在更新后過了一段時間又進行了回滾,那么事務B之前的更新就不作數了

但是事務A並不知道事務B回滾了,依然拿了錯誤的數據在自己搗鼓,這樣很顯然有問題,有大問題!

所以事務與事務間需要隔離開來,防止有奇奇怪怪的東西混進來(?),這就是我們說的,事務需要——隔離性


至於ACID剩下兩個持久性一致性

持久性即所有的數據需要持久化到磁盤,必須要持久啊!如果都存在內存里,我辛辛苦苦干一天,重啟回到解放前,啥也沒有,快樂白給。

另外:一致性,其實是原子性、隔離性、持久性的目的。

因為一致性的概念是:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。

回到開頭,為什么要有事務?不就是為了解決錢莫名其妙不見了等等等等的問題嗎?保證數據庫的完整性才是我們使用事務的目的。

tips:數據庫完整性:指的是數據庫的正確性(指的是數據符合語義,反應實際狀況)和相容性(指數據庫同一對象在不同關系表中數據是符合邏輯的)


以上為本人手敲,估摸着參考了百度/知乎/CSDN/博客園等等等等的一堆文章,然后自己手寫的,如有雷同,純屬巧合(耶)。

菜雞一枚,如有錯誤敬請指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM