資料庫事務詳解

2021-10-20 01:59:02 字數 2858 閱讀 5584

從根本上理解mysql事務,是指作為單個邏輯工作單元執行的一系列操作,要麼成功完全地執行,要麼失敗全部回滾。

最經典的例子:

使用者a往——》使用者b賬戶裡轉100塊錢。

正常邏輯:首先使用者a賬戶裡扣除一百元,然後使用者b賬戶增加100元,則轉賬操作完成。這是正常情況,接下來再看看這種情況:

使用者a賬戶裡扣除100元,這條操作語句執行完了,正要執行使用者b賬戶增加100元,這時候突然系統出問題了,宕機了程式沒有按流程接著往下走。這時候使用者a賬戶裡少了100,可使用者b賬戶裡卻沒有增加100。那這怎麼辦呢? 這時候就該用到事務了。

上面說過,作為單個邏輯工作單元執行的一系列操作,要麼成功完全地執行,要麼失敗全部回滾。系統要麼全部給我走完,要麼執行到一半失敗了進行回滾:使用者a賬戶裡扣了100元,準備往使用者b賬戶裡加100元的時候出問題了,好嘛,出問題了就出問題了嘛,我再回滾給使用者a賬戶裡加會100元不就好了嘛。

事務一共分為五個狀態:

活動的 ( active )事務對應的資料庫操作再執行過程中,該事務就處於活動的狀態。

部分提交的 ( partially committed )當資料庫事務中的最後乙個操作執行完成,但由於操作都在記憶體中執行,所以造成的影響並沒有更新到磁碟時,該事務就處在部分提交的狀態。

失敗的 ( failed )當事務處在活動的或者部分提交狀態時,可能遇到了某些錯誤(資料庫自身的錯誤,作業系統錯誤或者直接斷電)而無法繼續執行,或者認為的停止當前事務的執行,該事務就處在失敗的狀態。

中止的 ( aborted )如果事務執行了半截而變成失敗的狀態,撤銷失敗事務對當前資料庫造成的影響,我們把這個撤銷的過程稱之為回滾。 當回滾的操作執行完畢,也就是資料庫恢復到了執行事務之前的狀態,該事務就會處於終止的狀態。

提交的 ( committed )當乙個處在部分提交的狀態事務將修改過的資料都同步到磁碟之後,該事務就處於提交的狀態。

事務共有四大特性:

事務的資料操作,要麼全部執行成功,要麼全部失敗回滾到執行之前的狀態,就像這個事務從來沒有執行過一樣。事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。一致性處理資料庫中對所有語義約束的保護。假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的。例如,當資料庫處於一致性狀態s1時,對資料庫執行乙個事務,在事務執行期間假定資料庫的狀態是不一致的,當事務執行結束時,資料庫處在一致性狀態s2。

多個事務之前是相互隔離的,互不影響。資料庫允許多個併發同時對其資料進行讀寫和修改,隔離性可以防止多個事務併發執行時由於交叉執行而導致的資料不一致。

比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。

隔離性分為四個隔離級別:

讀未提交(read uncommitted):

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。該隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少,而且還會出現髒讀的情況。讀取到未提交的資料,也被稱之為髒讀(dirty read)。

讀已提交(read committed):

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。但會出現以下情況:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。

可重複讀(repeatable read):

讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他讀事務。避免了不可重複讀和髒讀,但是會出現幻讀,即第二次查詢資料時會包含第一次查詢中未出現的資料。避免了不可重複讀取和髒讀,但是有時可能出現幻讀。這可以通過「共享讀鎖」和「排他寫鎖」實現(mysql預設的隔離級別)。

序列化(serializable):

當執行某個事務的時候,禁止其他任何事務執行,必須乙個乙個進行。提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,但不能併發執行。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。序列化是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻讀。

四種事務隔離級別從上往下,級別越高,併發性越差,安全性就越來越高。 mysql預設隔離級別是可重複讀。

永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

永續性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即對已提交事務的更新能恢復。一旦乙個事務被提交,dbms(資料庫)必須保證提供適當的冗餘,使其耐得住系統的故障。所以,永續性主要在於dbms的恢復效能。

事物是通過事物日誌來實現的,事物日誌包括:redo log和undo log;

redo log 是重做日誌:

重做日誌是每當有操作執行前,將資料真正更改時,先前相關操作寫入重做日誌。這樣當斷電,或者一些意外,導致後續任務無法完成時,系統恢復後,可以繼續完成這些更改。

undo log 是回滾日誌

回滾日誌是當一些事務在執行一半時,發生意外,導致後續操作無法完成,則可以根據回滾日誌恢復到執行該事務之前的壯態。

sql語法優化寶典傳送門

資料庫事務詳解

事務 transaction 是由一系列對系統中資料進行訪問與更新的操作所組成的乙個程式執行邏輯單元。1.原子性 atomicity 事務的原子性是指事務必須是乙個原子的操作序列單元。事務中包含的各項操作在一次執行過程中,只允許出現兩種狀態之一。全部執行成功 全部執行失敗 任何一項操作都會導致整個事...

資料庫事務詳解

事務 transaction 是在同乙個處理單元中,由一系列對資料進行訪問與更新的操作所組成的乙個基本程式執行邏輯單元。資料庫事務其實主要做了以下兩方面的事 事務具有4個基本特徵,分別是 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 duration...

資料庫事務詳解

事務四特性 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行...