欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql事務(wù)的基本要素與事務(wù)隔離級別詳解

 更新時(shí)間:2023年08月15日 09:22:29   作者:SSS_HuLiang  
這篇文章主要介紹了mysql事務(wù)的基本要素與事務(wù)隔離級別詳解,事務(wù)是一種機(jī)制、一個(gè)操作序列,包含了一組數(shù)據(jù)庫操作命令,并且把所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請求,需要的朋友可以參考下

mysql事務(wù)(ACID,臟讀,不可重復(fù)讀,幻讀,隔離級別)

何為事務(wù)?事務(wù)是執(zhí)行某個(gè)任務(wù)時(shí)的一系列操作,是一組SQL語句,多條SQL的集合。

事務(wù)是一種機(jī)制、一個(gè)操作序列,包含了一組數(shù)據(jù)庫操作命令,并且把所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請求,即這一組數(shù)據(jù)庫命令要么都執(zhí)行,要么都不執(zhí)行。

一、事務(wù)的基本要素(ACID)

1、原子性(Atomicity)

原子,是物質(zhì)構(gòu)成的基本單位,不可分割,也就是說事務(wù)是一個(gè)不可分割的整體。

事務(wù)里面的SQL要么全執(zhí)行,要么全不執(zhí)行,不可能停滯在中間環(huán)節(jié)。

事務(wù)執(zhí)行過程中出錯(cuò),會(huì)回滾到事務(wù)開始前的狀態(tài),所有的操作就像沒有發(fā)生一樣。

例子:就拿A與B轉(zhuǎn)賬為例,一條語句從A里扣錢,另一條語句往B身上加錢,如果這兩條語句不能全部執(zhí)行,而是成功了一部分,那事務(wù)就沒有存在的意義了。

2、一致性(Consistency)

事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的一致性約束沒有被破壞。

例子:比如A向B轉(zhuǎn)賬100元,而余額里面只有90元,B已經(jīng)收到錢,A開始扣錢,發(fā)現(xiàn)錢不夠,然后事務(wù)需要回滾,這是原子性?。。。。ㄒ慈繄?zhí)行—轉(zhuǎn)賬成功一加一減,要么全部失敗—轉(zhuǎn)賬失敗,金額不變)。

所以不管是成功,還是失敗,數(shù)據(jù)都是一致的,什么意思呢?

轉(zhuǎn)賬成功,A減了錢,B加了錢,數(shù)據(jù)一致。轉(zhuǎn)賬失敗,A和B的錢都沒變化,數(shù)據(jù)一致。A減了錢,B卻沒收到,或者A沒減錢,B收到了,那數(shù)據(jù)就是不一致了。

一致性其實(shí)是由原子性(執(zhí)行成功,執(zhí)行失敗數(shù)據(jù)一致),隔離性(其他事務(wù)不會(huì)影響數(shù)據(jù)一致),持久性(需要數(shù)據(jù)持久化)決定的,也就是C是由AID做基礎(chǔ)的,保證了數(shù)據(jù)的一致性。

3、隔離性(Isolation)

同一時(shí)間,只允許一個(gè)事務(wù)請求同一數(shù)據(jù),不同的事務(wù)之間彼此沒有任何干擾。

例子:A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,B不能向這張卡轉(zhuǎn)賬。

再比如A用戶讀取訂單列表的時(shí)候,B用戶操作,把某條訂單給刪了,就造成了臟讀,A讀的數(shù)據(jù)是錯(cuò)誤的。

4、持久性(Durability)

事務(wù)完成后,事務(wù)對數(shù)據(jù)庫的所有更新將被保存到數(shù)據(jù)庫,不能回滾。

數(shù)據(jù)到物理存儲中,已經(jīng)持久化,所以有持久性。

二、事務(wù)的并發(fā)問題

1、臟讀(DirtyReads)

讀取了未提交的數(shù)據(jù):事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)。

例子:B修改了訂單詳情,還未提交事務(wù),A查看詳情(讀的是B修改后的數(shù)據(jù)),此時(shí)B事務(wù)出錯(cuò),進(jìn)行回滾。A查看的數(shù)據(jù)就是臟的(假數(shù)據(jù))。

2、不可重復(fù)讀(Non-RepeatableReads)

前后多次讀取,數(shù)據(jù)內(nèi)容不一致:事務(wù)A多次讀取同一數(shù)據(jù),事務(wù)B在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果不一致。

例子:事務(wù)A修改用戶姓名,此時(shí)年齡為20,事務(wù)B修改年齡為25,等事務(wù)A修改完再查詢,發(fā)現(xiàn)年齡由20變成了25。此時(shí)事務(wù)B回滾,A再返回頁面發(fā)現(xiàn)年齡變回了20,多次讀取,年齡20-25-20,重復(fù)讀出來的數(shù)據(jù)內(nèi)容不一致。

3、幻讀(PhantomRead)

前后多次讀取,數(shù)據(jù)內(nèi)容不一致

例子:A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)重置為0,但是B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)100的記錄,當(dāng)A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。 小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

三、mysql事務(wù)隔離級別

有四種隔離級別,用來解決數(shù)據(jù)庫操作中產(chǎn)生的各種問題。java中Connection類里面定義了對應(yīng)的數(shù)字,分別是

1、讀未提交(Readuncommitted)

所有事務(wù)能夠讀取其他事務(wù)未提交的數(shù)據(jù),會(huì)造成臟讀。因此在該種隔離級別下,造成臟讀、不可重復(fù)讀和幻讀。

2、讀已提交(Readcommitted)

Oracle和SQLServer默認(rèn)的隔離級別②

所有事務(wù)只能讀取其他事務(wù)已經(jīng)提交的內(nèi)容,能夠徹底解決臟讀的現(xiàn)象。但在這種隔離級別下,會(huì)出現(xiàn)一個(gè)事務(wù)的前后多次的查詢中卻返回了不同內(nèi)容的數(shù)據(jù)的現(xiàn)象,也就是出現(xiàn)了不可重復(fù)讀。

3、可重復(fù)讀(Repeatableread)

mysql默認(rèn)隔離級別④

所有事務(wù)前后多次的讀取到的數(shù)據(jù)內(nèi)容是不變的,也就是某個(gè)事務(wù)在執(zhí)行的過程中,不允許其他事務(wù)進(jìn)行update(delete也屬于update范疇)操作,但允許其他事務(wù)進(jìn)行add操作,造成某個(gè)事務(wù)前后多次讀取到的數(shù)據(jù)總量不一致的現(xiàn)象,從而產(chǎn)生幻讀。

4、可串行化(Serializable)

所有的事務(wù)就像被串起來,有秩序地執(zhí)行,類似java的synchronized同步。所以他們之間不存在沖突,從而能有效地解決臟讀、不可重復(fù)讀和幻讀的現(xiàn)象。

但是安全和效率不能兼得,會(huì)導(dǎo)致大量的操作超時(shí)和鎖競爭,從而大大降低數(shù)據(jù)庫的性能,一般不使用這樣事務(wù)隔離級別。

事務(wù)隔離級別對應(yīng)表

事務(wù)隔離級別臟讀不可重復(fù)讀幻讀
讀未提交(read-uncommitted)
不可重復(fù)讀(read-committed)
可重復(fù)讀(repeatable-read)
串行化(serializable)

到此這篇關(guān)于mysql事務(wù)的基本要素與事務(wù)隔離級別詳解的文章就介紹到這了,更多相關(guān)mysql事務(wù)的基本要素內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL數(shù)據(jù)庫查看數(shù)據(jù)表占用空間大小和記錄數(shù)的方法

    MySQL數(shù)據(jù)庫查看數(shù)據(jù)表占用空間大小和記錄數(shù)的方法

    這篇文章主要介紹了MySQL數(shù)據(jù)庫查看數(shù)據(jù)表占用空間大小和記錄數(shù)的方法,如果想知道MySQL數(shù)據(jù)庫中每個(gè)表占用的空間、表記錄的行數(shù)的話,可以打開MySQL的information_schema 數(shù)據(jù)庫查詢,本文就講解查詢方法,需要的朋友可以參考下
    2015-04-04
  • 深入解析MySQL的窗口函數(shù)

    深入解析MySQL的窗口函數(shù)

    這篇文章主要介紹了深入解析MySQL的窗口函數(shù),窗口可以理解為記錄集合,窗口函數(shù)就是在滿足某種條件的記錄集合上執(zhí)行的特殊函數(shù),即:應(yīng)用在窗口內(nèi)的函數(shù),需要的朋友可以參考下
    2023-07-07
  • MySQL?in太多過慢的三種解決方案

    MySQL?in太多過慢的三種解決方案

    在MySQL中有一個(gè)配置參數(shù)eq_range_index_dive_limit,它的作用是一個(gè)等值查詢(比如:in?查詢),使用掃描索引樹的方式分析在MySQL內(nèi)部叫做index dives,使用索引統(tǒng)計(jì)的方式分析在MySQL內(nèi)部叫做index statistics,本文給大家介紹了MySQL?in太多過慢的三種解決方案
    2024-05-05
  • MySQL使用臨時(shí)表加速查詢的方法

    MySQL使用臨時(shí)表加速查詢的方法

    這篇文章主要介紹了MySQL使用臨時(shí)表加速查詢的方法,分析了針對多次重復(fù)查詢使用臨時(shí)表的優(yōu)勢,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • mysql 5.7.23 安裝配置圖文教程

    mysql 5.7.23 安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.23 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL日期數(shù)據(jù)類型、時(shí)間類型使用總結(jié)

    MySQL日期數(shù)據(jù)類型、時(shí)間類型使用總結(jié)

    MySQL日期數(shù)據(jù)類型、MySQL時(shí)間類型使用總結(jié),需要的朋友可以參考下。
    2010-06-06
  • PHP5 mysqli的prepare準(zhǔn)備語句使用說明

    PHP5 mysqli的prepare準(zhǔn)備語句使用說明

    mysqli對prepare的支持對于大訪問量的網(wǎng)站是很有好處的,它極大地降低了系統(tǒng)開銷,而且保證了創(chuàng)建查詢的穩(wěn)定性和安全性.prepare準(zhǔn)備語句分為綁定參數(shù)和綁定結(jié)果
    2012-12-12
  • MySQL添加索引及添加字段并建立索引方式

    MySQL添加索引及添加字段并建立索引方式

    這篇文章主要介紹了MySQL添加索引及添加字段并建立索引方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL安全刪除binlog日志的詳細(xì)步驟

    MySQL安全刪除binlog日志的詳細(xì)步驟

    如果你的?Mysql?搭建了主從同步,或者數(shù)據(jù)庫開啟了log-bin日志,那么隨著時(shí)間的推移,你的數(shù)據(jù)庫data目錄下會(huì)產(chǎn)生大量的日志文件,下面這篇文章主要給大家介紹了關(guān)于MySQL安全刪除binlog日志的詳細(xì)步驟,需要的朋友可以參考下
    2024-02-02
  • MySQL中的if和case語句使用總結(jié)

    MySQL中的if和case語句使用總結(jié)

    這篇文章主要介紹了MySQL中的if和case語句使用總結(jié),本文講解了IF語句作為表達(dá)式和流程控制語句使用實(shí)例,需要的朋友可以參考下
    2015-02-02

最新評論