最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中事務(wù)概念的簡潔學(xué)習(xí)教程

 更新時間:2015年11月18日 17:58:25   作者:Mike  
這篇文章主要介紹了MySQL中的事務(wù)概念,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

事務(wù)是由一步或幾步數(shù)據(jù)庫操作序列組成邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行。程序和事務(wù)是兩個不同的概念。一般而言:一段程序中可能包含多個事務(wù)。

事務(wù)具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續(xù)性(Durability)。這四個特性也簡稱ACID性。

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

2)一致性:事務(wù)執(zhí)行的結(jié)果,必須使數(shù)據(jù)庫從一個一致性狀態(tài),變到另一個一致性狀態(tài)。當(dāng)數(shù)據(jù)庫中只包含事務(wù)成功提交的結(jié)果時,數(shù)據(jù)庫處于一致性狀態(tài)。一致性是通過原子性來保證的。

3)隔離性:各個事務(wù)的執(zhí)行互不干擾,任意一個事務(wù)的內(nèi)部操作對其他并發(fā)的事務(wù),都是隔離的。也就是說:并發(fā)執(zhí)行的事務(wù)之間不能看到對方的中間狀態(tài),并發(fā)執(zhí)行的事務(wù)之間不能相互影響。

4)持續(xù)性:持續(xù)性也稱為持久性,指事務(wù)一旦提交,對數(shù)據(jù)所做的任何改變,都要記錄到永久存儲器中,通常是保存進(jìn)物理數(shù)據(jù)庫。

在關(guān)系型數(shù)據(jù)庫中,事務(wù)的隔離性分為四個隔離級別,在解讀這四個級別前先介紹幾個關(guān)于讀數(shù)據(jù)的概念。

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)象被稱為臟讀。

2)不可重復(fù)讀(Non-Repeatable Reads):一個事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,我們稱之為不可重復(fù)讀。也就是說,這個事務(wù)在兩次讀取之間該數(shù)據(jù)被其它事務(wù)所修改。

3)幻讀(Phantom Reads):一個事務(wù)按相同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為幻讀。

 

事務(wù)四個隔離級別對比:

1)未提交讀(Read Uncommitted):SELECT語句以非鎖定方式被執(zhí)行,所以有可能讀到臟數(shù)據(jù),隔離級別最低。

2)提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)。即解決了臟讀,但未解決不可重復(fù)讀。

3)可重復(fù)讀(Repeated Read):在同一個事務(wù)內(nèi)的查詢都是事務(wù)開始時刻一致的,InnoDB的默認(rèn)級別。在SQL標(biāo)準(zhǔn)中,該隔離級別消除了不可重復(fù)讀,但是還存在幻讀。

4)串行讀(Serializable):完全的串行化讀,所有SELECT語句都被隱式的轉(zhuǎn)換成SELECT ... LOCK IN SHARE MODE,即讀取使用表級共享鎖,讀寫相互都會阻塞。隔離級別最高。


隔離級別對比表:

20151118175418212.jpg (589×166)

數(shù)據(jù)庫的事務(wù)有下列語句組成:

一組DML(Data Manipulate Language,即數(shù)據(jù)操作語言)經(jīng)過這組DML修改后數(shù)據(jù)將保持較好的一致性。

一個DDL(Data Definition Language,即數(shù)據(jù)定義語言)語句。

一個DCL(Data control Language,即數(shù)據(jù)控制語言)語句。

       DDL和DCL語句最多只能有一個,因為DDL和DCL語句都會導(dǎo)致事務(wù)立即提交。

       當(dāng)事務(wù)所包含的全部數(shù)據(jù)庫操作都成功執(zhí)行后,應(yīng)該提交(commit)事務(wù),使這些修改永久生效。

       事務(wù)提交有兩種方式:顯式提交和自動提交。

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

(2)自動提交:執(zhí)行DDL或DCL,或者程序正常退出。

數(shù)據(jù)庫事務(wù)傳播級別,指的是事務(wù)嵌套時,應(yīng)該采用什么策略,即在一個事務(wù)中調(diào)用別的事務(wù),該怎么辦

假如有一下兩個事務(wù):

ServiceA {  
     void methodA ()  {  
     ServiceB . methodB ();  
   }  
  
}  
  
ServiceB {  
   void methodB ()  {  
   }   
} 

1 : PROPAGATION_REQUIRED

加入當(dāng)前正要執(zhí)行的事務(wù)不在另外一個事務(wù)里,那么就起一個新的事務(wù)

比如說, ServiceB.methodB 的事務(wù)級別定義為 PROPAGATION_REQUIRED, 那么由于執(zhí)行 ServiceA.methodA 的時候,

ServiceA.methodA 已經(jīng)起了事務(wù),這時調(diào)用 ServiceB.methodB , ServiceB.methodB 看到自己已經(jīng)運(yùn)行在 ServiceA.methodA

的事務(wù)內(nèi)部,就不再起新的事務(wù)。而假如 ServiceA.methodA 運(yùn)行的時候發(fā)現(xiàn)自己沒有在事務(wù)中,他就會為自己分配一個事務(wù)。

這樣,在 ServiceA.methodA 或者在 ServiceB.methodB 內(nèi)的任何地方出現(xiàn)異常,事務(wù)都會被回滾。即使 ServiceB.methodB 的事務(wù)已經(jīng)被

提交,但是 ServiceA.methodA 在接下來 fail 要回滾, ServiceB.methodB 也要回滾

2 : PROPAGATION_SUPPORTS

如果當(dāng)前在事務(wù)中,即以事務(wù)的形式運(yùn)行,如果當(dāng)前不再一個事務(wù)中,那么就以非事務(wù)的形式運(yùn)行

3 : PROPAGATION_MANDATORY

必須在一個事務(wù)中運(yùn)行。也就是說,他只能被一個父事務(wù)調(diào)用。否則,他就要拋出異常

4 : PROPAGATION_REQUIRES_NEW

這個就比較繞口了。 比如我們設(shè)計 ServiceA.methodA 的事務(wù)級別為 PROPAGATION_REQUIRED , ServiceB.methodB 的事務(wù)級別為 PROPAGATION_REQUIRES_NEW ,

那么當(dāng)執(zhí)行到 ServiceB.methodB 的時候, ServiceA.methodA 所在的事務(wù)就會掛起, ServiceB.methodB 會起一個新的事務(wù),等待 ServiceB.methodB 的事務(wù)完成以后,

他才繼續(xù)執(zhí)行。他與 PROPAGATION_REQUIRED 的事務(wù)區(qū)別在于事務(wù)的回滾程度了。因為 ServiceB.methodB 是新起一個事務(wù),那么就是存在

兩個不同的事務(wù)。如果 ServiceB.methodB 已經(jīng)提交,那么 ServiceA.methodA 失敗回滾, ServiceB.methodB 是不會回滾的。如果 ServiceB.methodB 失敗回滾,

如果他拋出的異常被 ServiceA.methodA 捕獲, ServiceA.methodA 事務(wù)仍然可能提交。

5 : PROPAGATION_NOT_SUPPORTED

當(dāng)前不支持事務(wù)。比如 ServiceA.methodA 的事務(wù)級別是 PROPAGATION_REQUIRED ,而 ServiceB.methodB 的事務(wù)級別是 PROPAGATION_NOT_SUPPORTED ,

那么當(dāng)執(zhí)行到 ServiceB.methodB 時, ServiceA.methodA 的事務(wù)掛起,而他以非事務(wù)的狀態(tài)運(yùn)行完,再繼續(xù) ServiceA.methodA 的事務(wù)。

6 : PROPAGATION_NEVER

不能在事務(wù)中運(yùn)行。假設(shè) ServiceA.methodA 的事務(wù)級別是 PROPAGATION_REQUIRED , 而 ServiceB.methodB 的事務(wù)級別是 PROPAGATION_NEVER ,

那么 ServiceB.methodB 就要拋出異常了。

7 : PROPAGATION_NESTED

理解 Nested 的關(guān)鍵是 savepoint 。他與 PROPAGATION_REQUIRES_NEW 的區(qū)別是, PROPAGATION_REQUIRES_NEW 另起一個事務(wù),將會與他的父事務(wù)相互獨立,

而 Nested 的事務(wù)和他的父事務(wù)是相依的,他的提交是要等和他的父事務(wù)一塊提交的。也就是說,如果父事務(wù)最后回滾,他也要回滾的。

而 Nested 事務(wù)的好處是他有一個 savepoint 。

相關(guān)文章

  • MySQL如何使用時間作為判斷條件

    MySQL如何使用時間作為判斷條件

    這篇文章主要介紹了MySQL如何使用時間作為判斷條件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • MySQL將查詢結(jié)果用英文逗號,連接的實現(xiàn)方式

    MySQL將查詢結(jié)果用英文逗號,連接的實現(xiàn)方式

    這篇文章主要介紹了MySQL將查詢結(jié)果用英文逗號,連接的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • mysql中數(shù)據(jù)統(tǒng)計的技巧備忘錄

    mysql中數(shù)據(jù)統(tǒng)計的技巧備忘錄

    mysql是常用數(shù)據(jù)庫,對于數(shù)字操作相關(guān)的東西相當(dāng)方便,這篇文章主要給大家介紹了關(guān)于mysql中數(shù)據(jù)統(tǒng)計技巧的相關(guān)資料,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • mysql grants小記

    mysql grants小記

    grant命令是對mysql數(shù)據(jù)庫進(jìn)行用戶創(chuàng)建,權(quán)限或其他參數(shù)控制的強(qiáng)大的命令,官網(wǎng)上介紹它就有幾大頁,要用精它恐怕不是一日半早的事情,權(quán)宜根據(jù)心得慢慢領(lǐng)會吧!
    2011-05-05
  • MySQL索引查詢limit?offset及排序order?by用法

    MySQL索引查詢limit?offset及排序order?by用法

    這篇文章主要介紹了MySQL限制數(shù)據(jù)返回條數(shù)limit?offset及排序order?by用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 一文深入探討MySQL是如何解決幻讀問題

    一文深入探討MySQL是如何解決幻讀問題

    SQL標(biāo)準(zhǔn)中定義了4種隔離級別,分別是讀未提交、讀已提交、可重復(fù)讀以及序列化。不同的隔離級別下,本文將重點探討下MySQL是如何解決幻讀問題的,需要的朋友可以跟著小編一起來探討一下
    2023-07-07
  • MySQL的ORDER BY及優(yōu)化過程詳解

    MySQL的ORDER BY及優(yōu)化過程詳解

    在MySQL中,索引的最左匹配原則是指在使用索引進(jìn)行查詢時,會優(yōu)先匹配索引的最左側(cè)列,然后再匹配后續(xù)列,本文將基于InnoDB引擎,詳細(xì)分析如何優(yōu)化MySQL索引最左匹配下的ORDER BY語句,需要的朋友可以參考下
    2024-07-07
  • MySQL中連接查詢和子查詢的問題

    MySQL中連接查詢和子查詢的問題

    這篇文章主要介紹了MySQL中連接查詢和子查詢的問題,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • mysql分區(qū)表的增刪改查的實現(xiàn)示例

    mysql分區(qū)表的增刪改查的實現(xiàn)示例

    增刪查改在數(shù)據(jù)庫中是很常見的操作,本文主要介紹了mysql分區(qū)表的增刪改查的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Ubuntu與windows雙系統(tǒng)下共用MySQL數(shù)據(jù)庫的方法

    Ubuntu與windows雙系統(tǒng)下共用MySQL數(shù)據(jù)庫的方法

    ubuntu系統(tǒng)和windows系統(tǒng)雙系統(tǒng)共用是用戶喜歡使用的方式之一,而MySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在Windows平臺中常以WAMP方式搭配使用,在Linux平臺中常以LAMP組合形式出現(xiàn),下面的方法可以使得Ubuntu平臺共用Windows平臺中的MySQL數(shù)據(jù)庫
    2012-01-01

最新評論

明星| 临武县| 济南市| 南开区| 华容县| 杨浦区| 贵南县| 惠水县| 吉林省| 东阿县| 肥西县| 长垣县| 广水市| 磐石市| 濉溪县| 米脂县| 凌海市| 梅河口市| 黄龙县| 当涂县| 凉城县| 鄂伦春自治旗| 邛崃市| 合阳县| 肥东县| 五河县| 香港| 从江县| 城市| 崇文区| 平邑县| 耒阳市| 大足县| 鹰潭市| 伊春市| 溆浦县| 晋宁县| 阿巴嘎旗| 昌宁县| 凤庆县| 陇川县|