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/博客園等等等等的一堆文章,然后自己手寫的,如有雷同,純屬巧合(耶)。
菜雞一枚,如有錯誤敬請指正。