資料庫事務詳解
提示:事務主要是為了保證復雜資料庫操作資料的一致性,尤其是在并發訪問資料時,MySQL事務主要用于處理操作量大,復雜度高的資料,
一、什么是資料庫事務?
從根本上理解MySQL事務,是指作為單個邏輯作業單元執行的一系列操作,要么成功完全地執行,要么失敗全部回滾,
最經典的例子:
用戶A往——》用戶B賬戶里轉100塊錢,
正常邏輯:首先用戶A賬戶里扣除一百元,然后用戶B賬戶增加100元,則轉賬操作完成,這是正常情況,接下來再看看這種情況:
用戶A賬戶里扣除100元,這條操作陳述句執行完了,正要執行用戶B賬戶增加100元,這時候突然系統出問題了,宕機了程式沒有按流程接著往下走,這時候用戶A賬戶里少了100,可用戶B賬戶里卻沒有增加100,那這怎么辦呢? 這時候就該用到事務了,
上面說過,作為單個邏輯作業單元執行的一系列操作,要么成功完全地執行,要么失敗全部回滾,系統要么全部給我走完,要么執行到一半失敗了進行回滾:用戶A賬戶里扣了100元,準備往用戶B賬戶里加100元的時候出問題了,好嘛,出問題了就出問題了嘛,我再回滾給用戶A賬戶里加會100元不就好了嘛,
事物是通過事物日志來實作的,事物日志包括:redo log和undo log
二、事務有哪些狀態?
事務一共分為五個狀態:
-
活動的 ( active ) 事務對應的市局庫操作再執行程序中,該事務就處于活動的狀態,
-
部分提交的 ( partially committed ) 當資料庫事務中的最后一個操作執行完成,但由于操作都在記憶體中執行,所以造成的影響并沒有更新到磁盤時,該事務就處在部分提交的狀態,
-
失敗的 ( failed ) 當事務處在活動的或者部分提交狀態時,可能遇到了某些錯誤(資料庫自身的錯誤,作業系統錯誤或者直接斷電)而無法繼續執行,或者認為的停止當前事務的執行,該事務就處在失敗的狀態,
-
中止的 ( aborted ) 如果事務執行了半截而變成失敗的狀態,撤銷失敗事務對當前資料庫造成的影響,我們把這個撤銷的程序稱之為回滾, 當回滾的操作執行完畢,也就是資料庫恢復到了執行事務之前的狀態,該事務就會處于終止的狀態,
-
提交的 ( committed ) 當一個處在部分提交的狀態事務將修改過的資料都同步到磁盤之后,該事務就處于提交的狀態,
三、事務有哪些特性?
事務共有四大特性:
1.原子性( Atomicity)
事務的資料操作,要么全部執行成功,要么全部失敗回滾到執行之前的狀態,就像這個事務從來沒有執行過一樣,事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響,
2.一致性( Atomicity)
一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態,一致性處理資料庫中對所有語意約束的保護,假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的,例如,當資料庫處于一致性狀態S1時,對資料庫執行一個事務,在事務執行期間假定資料庫的狀態是不一致的,當事務執行結束時,資料庫處在一致性狀態S2,
3.隔離性 ( Consistency)
多個事務之前是相互隔離的,互不影響,資料庫允許多個并發同時對其資料進行讀寫和修改,隔離性可以防止多個事務并發執行時由于交叉執行而導致的資料不一致,
比如操作同一張表時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離,
隔離性分為四個隔離級別:
-
讀未提交(Read Uncommitted):
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果,該隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少,而且還會出現臟讀的情況,讀取到未提交的資料,也被稱之為臟讀(Dirty Read), -
讀已提交(Read Committed):
這是大多數資料庫系統的默認隔離級別(但不是MySQL默認的),它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變,但會出現以下情況:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的程序中,對資料作了更新并提交,導致事務A多次讀取同一資料時,結果 不一致, -
可重復讀(Repeatable Read):
讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務,讀事務會禁止所有的寫事務,但是允許讀事務,避免了不可重復讀和臟讀,但是會出現幻讀,即第二次查詢資料時會包含第一次查詢中未出現的資料,避免了不可重復讀取和臟讀,但是有時可能出現幻讀,這可以通過“共享讀鎖”和“排他寫鎖”實作(MySQL默認的隔離級別), -
序列化(Serializable):
當執行某個事務的時候,禁止其他任何事務運行,必須一個一個進行,提供嚴格的事務隔離,它要求事務序列化執行,事務只能一個接著一個地執行,但不能并發執行,如果僅僅通過“行級鎖”是無法實作事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到,序列化是最高的事務隔離級別,同時代價也花費最高,性能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免臟讀、不可重復讀,還避免了幻讀,
四種事務隔離級別從上往下,級別越高,并發性越差,安全性就越來越高, MySQL默認隔離級別是可重復讀,
4.持久性(Durability)
持久性是指一個事務一旦被提交了,那么對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作,
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失,即對已提交事務的更新能恢復,一旦一個事務被提交,DBMS(資料庫)必須保證提供適當的冗余,使其耐得住系統的故障,所以,持久性主要在于DBMS的恢復性能,
另外推薦一篇sql語法調優文章,希望對各位小伙伴能有所提升!
SQL語法優化寶典傳送門
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/263899.html
標籤:其他
上一篇:SCD緩慢變化維拉鏈表
