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

mysql事務的基本要素與事務隔離級別詳解

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

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

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

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

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

1、原子性(Atomicity)

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

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

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

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

2、一致性(Consistency)

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

例子:比如A向B轉(zhuǎn)賬100元,而余額里面只有90元,B已經(jīng)收到錢,A開始扣錢,發(fā)現(xiàn)錢不夠,然后事務需要回滾,這是原子性!?。。。ㄒ慈繄?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ù)就是不一致了。

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

3、隔離性(Isolation)

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

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

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

4、持久性(Durability)

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

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

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

1、臟讀(DirtyReads)

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

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

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

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

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

3、幻讀(PhantomRead)

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

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

三、mysql事務隔離級別

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

1、讀未提交(Readuncommitted)

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

2、讀已提交(Readcommitted)

Oracle和SQLServer默認的隔離級別②

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

3、可重復讀(Repeatableread)

mysql默認隔離級別④

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

4、可串行化(Serializable)

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

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

事務隔離級別對應表

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

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

相關文章

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

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

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

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

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

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

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

    MySQL使用臨時表加速查詢的方法

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

    mysql 5.7.23 安裝配置圖文教程

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

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

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

    PHP5 mysqli的prepare準備語句使用說明

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

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

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

    MySQL安全刪除binlog日志的詳細步驟

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

    MySQL中的if和case語句使用總結

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

最新評論