MySQL中事務概念的簡潔學習教程

2022-10-06 01:33:11 字數 3743 閱讀 4386

事務是由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。程式和事務是兩個不同的概念。一般而言:一段程式中可能包含多個事務。

事務具有四個特性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持續性(durability)。這四個特性也簡稱acid性。

1)原子性:事務是應用中最小的執行單位,就如原子是自然界最小顆粒,具有不可再分的特徵一樣。事務是應用中不可再分的最小邏輯執行體。

2)一致性:事務執行的結果,必須使資料庫從乙個一致性狀態,變到另乙個一致性狀態。當資料庫中只包含事務成功提交的結果時,資料庫處於一致性狀態。一致性是通過原子性來保證的。

3)隔離性:各個事務的執行互不干擾,任意乙個事務的內部操作對其他併發的事務,都是隔離的。也就是說:併發執行的事務之間不能看到對方的中間狀態,併發執行的事務之間不能相互影響。

4)持續性:持續性也稱為永續性,指事務一旦提交,對資料所做的任何改變,www.cppcns.com都要記錄到永久儲存器中,通常是儲存進物理資料庫。

在關係型資料庫中,事務的隔離性分為四個隔離級別,在解讀這四個級別前先介紹幾個關於讀資料的概念。

1)髒讀(dirty reads):所謂髒讀就是對髒資料(drity data)的讀取,而髒資料所指的就是未提交的資料。也就是說,乙個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條資料是處於待定狀態的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的資料,並據此做進一步的處理,就會產生未提交的資料依賴關係。這種現象被稱為髒讀。

2)不可重複讀(non-repeatable reads):乙個事務先後讀取同一條記錄,但兩次讀取的資料不同,我們稱之為不可重複讀。也就是說,這個事務在兩次讀取之間該資料被其它事務所修改。

3)幻讀(phantom reads):乙個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為幻讀。

事務四個隔離級別對比:

1)未提交讀(read uncommitted):select語句以非鎖定方式被執行,所以有可能讀到髒資料,隔離級別最低。

2)提交讀(read committed):只能讀取到已經提交的資料。即解決了髒讀,但未解決不可重複讀。

3)可重複讀(repeated read):在同乙個事務內的查詢都是事務開始時刻一致的,innodb的預設級別。在sql標準中,該隔離級別消除了不可重複讀,但是還存在幻讀。

4)序列讀(serializable):完全的序列化讀,所有select語句都被隱式的轉換成select ... lock in share mode,即讀取使用表級共享鎖,讀寫相互都會阻塞。隔離級別最高。

隔離級別對比表:

資料庫的事務有下列語句組成:

一組dml(data manipulate language,即資料操作語言)經過這組dml修改後資料將保持較好的一致性。

乙個ddl(data definition language,即資料定義語言)語句。

乙個dcl(data control language,即資料控制語言)語句。

ddl和dcl語句最多只能有乙個,因為ddl和dcl語句都會導致事務立即提交。

當事務所包含的全部資料庫操作都成功執行後,應該提交(commit)事務,使這些修改永久生效。

事務提交有兩種方式:顯式提交和自動提交。

(1)顯式提交:使用commit。

(2)自動提交:執行ddl或dcl,或者程式正常退出。

資料庫事務傳播級別,指的是事務巢狀時,應該採用什麼策略,即在乙個事務中呼叫別的事務,該怎麼辦

假如有一下兩個事務:

servicea

} serviceb

}1 : propagation_required

加入當前正要執行的事務不在另外乙個事務裡,那麼就起乙個新的事務

比如說, serviceb.methodb 的事務級別定義為 propagation_required, 那麼由於執行 servicea.methoda 的時候,

servicea.methoda 已經起了事務,這時呼叫 serviceb.methodb , serviceb.methodb 看到自己已經執行在 servicea.methoda

的事務內部,就不再起新的事務。而假如 servicea.methoda 執行的時候發現自己沒有在事務中,他就會為自己分配乙個事務。

這樣,在 servicea.methoda 或者在 serviceb.methodb 內的任何地方出現異常,事務都會被回滾。即使 serviceb.methodb 的事務已經被

提交,但是 servicea.methoda 在接下來 fail 要回滾, serviceb.methodb 也要回滾

2 : propagation_supports

如果當前在事務中,即以事務的形式執行,如果當前不再乙個事務中,那麼就以非事務的形式執行

3 : propagation_mandatory

必須在乙個事務中執行。也就是說,他只能被乙個父事務呼叫。否則,他就要丟擲異常

4 : propagation_requires_new

這個就比較繞口了。 比如我們設計 servicea.methoda 的事務級別為 propagation_required , serviceb.methodb 的事務級別為 propagation_requires_new ,

那麼當執行到 serviceb.methodb 的時候, servicea.methoda 所在的事務就會掛起, serviceb.methodb 會起乙個新的事務,等待 serviceb.methodb 的事務完成以後,

他才繼續執行。他與 propagation_required 的事務區別在於事務的回滾程度了。因為 servi程式設計客棧ceb.methodb 是新起乙個事務,那麼就是存在

兩個不同的事務。如果 serviceb.methodb 已經提交,那麼 servicea.methoda 失敗回滾, serviceb.methodb 是不會回滾的。如果 serviceb.methodb 失敗回滾,

如果他丟擲的異常被 servicea.methoda 捕獲, servicea.methoda 事務仍然可能提交

5 : propagation_not_supported

當前不支援事務。比如 servicea.methoda 的事務級別是 propagation_required ,而 serviceb.methodb 的事務級別是 propagation_not_supported ,

那麼當執行到 serviceb.methodb 時, servicea.methoda 的事務掛起,而他以非事務的狀態執行完,再繼續 servicea.methoda 的事務。

6 : propagation_never

不能在事務中執行。假設 servicea.methoda 的事務級別是 propagation_required , 而 serviceb.mhbtrvethodb 的事務級別是 propagation_never ,

那麼 serviceb.methodb 就要丟擲異常了。

7 : propagation_nested

理解 nested 的關鍵是 s**epoint 。他與 propagation_requires_new 的區別是, propagation_requires_new 另起乙個事務,將會與他的父事務相互獨立,

而 nested 的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。也就是說,如果父事務最後回滾,他也要回滾的。

而 nested 事務的好處是他有乙個 s**epoint 。

本文標題: mysql中事務概念的簡潔學習教程

本文位址:

事務的概念和MySQL事務支援

事務是由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。程式和事務是兩個不同的概念。一般而言 一段程式中可能包含多個事務。事務具有四個特性 原子性 atomicity 一致性 consistency 隔離性 isolation 和持續性 durability 這四...

事務的概念和MySQL事務支援

事務是由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。程式和事務是兩個不同的概念。一般而言 一段程式中可能包含多個事務。事務具有四個特性 原子性 atomicity 一致性 consistency 隔離性 isolation 和持續性 durability 這四...

MySQL 事務概念 ACID

事務是用來保證業務操作的完整性 整個業務要麼全部成功,要麼全部失敗,不允許部分成功,部分失敗 a 原子性 c 一致性 i 隔離性 d 永續性 讀未提交 read uncommitted 讀已提交 read commited 可重複讀 repeatable read 序列化讀 serlalizable...