《Mysql實(shí)例MySQL中事務(wù)概念的簡潔學(xué)習(xí)教程》要點(diǎn):
本文介紹了Mysql實(shí)例MySQL中事務(wù)概念的簡潔學(xué)習(xí)教程,希望對您有用。如果有疑問,可以聯(lián)系我們。
事務(wù)是由一步或幾步數(shù)據(jù)庫操作序列組成邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行.程序和事務(wù)是兩個不同的概念.一般而言:一段程序中可能包括多個事務(wù).MYSQL入門
事務(wù)具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和連續(xù)性(Durability).這四個特性也簡稱ACID性.MYSQL入門
1)原子性:事務(wù)是應(yīng)用中最小的執(zhí)行單位,就如原子是自然界最小顆粒,具有弗成再分的特征一樣.事務(wù)是應(yīng)用中弗成再分的最小邏輯執(zhí)行體.MYSQL入門
2)一致性:事務(wù)執(zhí)行的結(jié)果,必須使數(shù)據(jù)庫從一個一致性狀態(tài),變到另一個一致性狀態(tài).當(dāng)數(shù)據(jù)庫中只包括事務(wù)成功提交的結(jié)果時,數(shù)據(jù)庫處于一致性狀態(tài).一致性是通過原子性來保證的.MYSQL入門
3)隔離性:各個事務(wù)的執(zhí)行互不干擾,任意一個事務(wù)的內(nèi)部操作對其他并發(fā)的事務(wù),都是隔離的.也便是說:并發(fā)執(zhí)行的事務(wù)之間不能看到對方的中間狀態(tài),并發(fā)執(zhí)行的事務(wù)之間不能相互影響.MYSQL入門
4)持續(xù)性:持續(xù)性也稱為持久性,指事務(wù)一旦提交,對數(shù)據(jù)所做的任何改變,都要記錄到永久存儲器中,通常是保留進(jìn)物理數(shù)據(jù)庫.MYSQL入門
在關(guān)系型數(shù)據(jù)庫中,事務(wù)的隔離性分為四個隔離級別,在解讀這四個級別前先介紹幾個關(guān)于讀數(shù)據(jù)的觀點(diǎn).MYSQL入門
1)臟讀(Dirty Reads):所謂臟讀便是對臟數(shù)據(jù)(Drity Data)的讀取,而臟數(shù)據(jù)所指的便是未提交的數(shù)據(jù).也便是說,一個事務(wù)正在對一條記錄做修改,在這個事務(wù)完成并提交之前,這條數(shù)據(jù)是處于待定狀態(tài)的(可能提交也可能回滾),這時,第二個事務(wù)來讀取這條沒有提交的數(shù)據(jù),并據(jù)此做進(jìn)一步的處理,就會產(chǎn)生未提交的數(shù)據(jù)依賴關(guān)系.這種現(xiàn)象被稱為臟讀.MYSQL入門
2)不可重復(fù)讀(Non-Repeatable Reads):一個事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,我們稱之為不可重復(fù)讀.也便是說,這個事務(wù)在兩次讀取之間該數(shù)據(jù)被其它事務(wù)所修改.MYSQL入門
3)幻讀(Phantom Reads):一個事務(wù)按相同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為幻讀.MYSQL入門
?MYSQL入門
事務(wù)四個隔離級別對照:MYSQL入門
1)未提交讀(Read Uncommitted):SELECT語句以非鎖定方式被執(zhí)行,所以有可能讀到臟數(shù)據(jù),隔離級別最低.MYSQL入門
2)提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù).即辦理了臟讀,但未辦理不可重復(fù)讀.MYSQL入門
3)可重復(fù)讀(Repeated Read):在同一個事務(wù)內(nèi)的查詢都是事務(wù)開始時刻一致的,InnoDB的默認(rèn)級別.在SQL尺度中,該隔離級別消除了不可重復(fù)讀,但是還存在幻讀.MYSQL入門
4)串行讀(Serializable):完全的串行化讀,所有SELECT語句都被隱式的轉(zhuǎn)換成SELECT ... LOCK IN SHARE MODE,即讀取使用表級共享鎖,讀寫相互都邑阻塞.隔離級別最高.MYSQL入門
隔離級別對照表:MYSQL入門
MYSQL入門
數(shù)據(jù)庫的事務(wù)有下列語句構(gòu)成:MYSQL入門
一組DML(Data Manipulate Language,即數(shù)據(jù)操作語言)經(jīng)過這組DML修改后數(shù)據(jù)將堅(jiān)持較好的一致性.MYSQL入門
一個DDL(Data Definition Language,即數(shù)據(jù)界說語言)語句.MYSQL入門
一個DCL(Data control Language,即數(shù)據(jù)控制語言)語句.MYSQL入門
?????? DDL和DCL語句最多只能有一個,因?yàn)镈DL和DCL語句都邑導(dǎo)致事務(wù)立即提交.MYSQL入門
?????? 當(dāng)事務(wù)所包括的全部數(shù)據(jù)庫操作都成功執(zhí)行后,應(yīng)該提交(commit)事務(wù),使這些修改永久生效.MYSQL入門
?????? 事務(wù)提交有兩種方式:顯式提交和自動提交.MYSQL入門
(1)顯式提交:使用commit.MYSQL入門
(2)自動提交:執(zhí)行DDL或DCL,或者法式正常退出.MYSQL入門
數(shù)據(jù)庫事務(wù)傳播級別,指的是事務(wù)嵌套時,應(yīng)該采用什么策略,即在一個事務(wù)中調(diào)用其余事務(wù),該怎么辦MYSQL入門
假如有一下兩個事務(wù):MYSQL入門
ServiceA { void methodA () { ServiceB . methodB (); } } ServiceB { void methodB () { } }
1 : PROPAGATION_REQUIREDMYSQL入門
參加當(dāng)前正要執(zhí)行的事務(wù)不在另外一個事務(wù)里,那么就起一個新的事務(wù)MYSQL入門
好比說, ServiceB.methodB 的事務(wù)級別定義為 PROPAGATION_REQUIRED, 那么由于執(zhí)行 ServiceA.methodA 的時候,MYSQL入門
ServiceA.methodA 已經(jīng)起了事務(wù),這時調(diào)用 ServiceB.methodB , ServiceB.methodB 看到本身已經(jīng)運(yùn)行在 ServiceA.methodAMYSQL入門
的事務(wù)內(nèi)部,就不再起新的事務(wù).而假如 ServiceA.methodA 運(yùn)行的時候發(fā)現(xiàn)本身沒有在事務(wù)中,他就會為本身分配一個事務(wù).MYSQL入門
這樣,在 ServiceA.methodA 或者在 ServiceB.methodB 內(nèi)的任何地方呈現(xiàn)異常,事務(wù)都會被回滾.即使 ServiceB.methodB 的事務(wù)已經(jīng)被MYSQL入門
提交,然則 ServiceA.methodA 在接下來 fail 要回滾, ServiceB.methodB 也要回滾MYSQL入門
2 : PROPAGATION_SUPPORTSMYSQL入門
如果當(dāng)前在事務(wù)中,即以事務(wù)的形式運(yùn)行,如果當(dāng)前不再一個事務(wù)中,那么就以非事務(wù)的形式運(yùn)行MYSQL入門
3 : PROPAGATION_MANDATORYMYSQL入門
必需在一個事務(wù)中運(yùn)行.也就是說,他只能被一個父事務(wù)調(diào)用.否則,他就要拋出異常MYSQL入門
4 : PROPAGATION_REQUIRES_NEWMYSQL入門
這個就比擬繞口了. 比如我們設(shè)計 ServiceA.methodA 的事務(wù)級別為 PROPAGATION_REQUIRED , ServiceB.methodB 的事務(wù)級別為 PROPAGATION_REQUIRES_NEW ,MYSQL入門
那么當(dāng)執(zhí)行到 ServiceB.methodB 的時候, ServiceA.methodA 所在的事務(wù)就會掛起, ServiceB.methodB 會起一個新的事務(wù),期待 ServiceB.methodB 的事務(wù)完成以后,MYSQL入門
他才繼續(xù)執(zhí)行.他與 PROPAGATION_REQUIRED 的事務(wù)區(qū)別在于事務(wù)的回滾程度了.因?yàn)?ServiceB.methodB 是新起一個事務(wù),那么便是存在MYSQL入門
兩個分歧的事務(wù).如果 ServiceB.methodB 已經(jīng)提交,那么 ServiceA.methodA 失敗回滾, ServiceB.methodB 是不會回滾的.如果 ServiceB.methodB 失敗回滾,MYSQL入門
如果他拋出的異常被 ServiceA.methodA 捕捉, ServiceA.methodA 事務(wù)仍然可能提交.MYSQL入門
5 : PROPAGATION_NOT_SUPPORTEDMYSQL入門
當(dāng)前不支持事務(wù).好比 ServiceA.methodA 的事務(wù)級別是 PROPAGATION_REQUIRED ,而 ServiceB.methodB 的事務(wù)級別是 PROPAGATION_NOT_SUPPORTED ,MYSQL入門
那么當(dāng)執(zhí)行到 ServiceB.methodB 時, ServiceA.methodA 的事務(wù)掛起,而他以非事務(wù)的狀態(tài)運(yùn)行完,再繼續(xù) ServiceA.methodA 的事務(wù).MYSQL入門
6 : PROPAGATION_NEVERMYSQL入門
不克不及在事務(wù)中運(yùn)行.假設(shè) ServiceA.methodA 的事務(wù)級別是 PROPAGATION_REQUIRED , 而 ServiceB.methodB 的事務(wù)級別是 PROPAGATION_NEVER ,MYSQL入門
那么 ServiceB.methodB 就要拋出非常了.MYSQL入門
7 : PROPAGATION_NESTEDMYSQL入門
懂得 Nested 的關(guān)鍵是 savepoint .他與 PROPAGATION_REQUIRES_NEW 的區(qū)別是, PROPAGATION_REQUIRES_NEW 另起一個事務(wù),將會與他的父事務(wù)相互獨(dú)立,MYSQL入門
而 Nested 的事務(wù)和他的父事務(wù)是相依的,他的提交是要等和他的父事務(wù)一塊提交的.也便是說,如果父事務(wù)最后回滾,他也要回滾的.MYSQL入門
而 Nested 事務(wù)的利益是他有一個 savepoint .MYSQL入門
歡迎參與《Mysql實(shí)例MySQL中事務(wù)概念的簡潔學(xué)習(xí)教程》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9855.html