溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL事務(wù)與隔離級(jí)別如何使用

發(fā)布時(shí)間:2023-02-25 10:31:59 來(lái)源:億速云 閱讀:128 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“MySQL事務(wù)與隔離級(jí)別如何使用”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“MySQL事務(wù)與隔離級(jí)別如何使用”文章能幫助大家解決問題。

    什么是事務(wù)

    事務(wù)就是一組操作的集合,事務(wù)將整組操作作為一個(gè)整體,共同提交或者共同撤銷

    這些操作只能同時(shí)成功或者同時(shí)失敗,成功即可提交事務(wù),失敗就執(zhí)行事務(wù)回滾

    MySQL的事務(wù)默認(rèn)是自動(dòng)提交的,一條語(yǔ)句執(zhí)行成功,MySQL將會(huì)隱式的提交事務(wù)

    以轉(zhuǎn)賬為例,張三向李四轉(zhuǎn)賬1000元

    這個(gè)整體行為包含三個(gè)操作:首先查詢張三賬戶的余額,其次將張三賬戶余額-1000,最后將李四賬戶余額+1000。事務(wù)就是將這三個(gè)操作看作最小提交單元,就是一榮俱榮一損俱損。

    -- 查看事務(wù)管理狀態(tài)  1-自動(dòng)  0-手動(dòng)
    select @@autocommit;
    -- 設(shè)置事務(wù)手動(dòng)管理
    set @@autocommit = 0;
    -- 開啟事務(wù)
    start transaction;
    -- 開啟事務(wù):start transaction 或者 begin
    select money from account where name = '張三';
    update account set money = money - 1000 where name = '張三';
    update account set money = money + 1000 where name = '李四';
    -- 事務(wù)提交
    commit;
    -- 事務(wù)回滾
    rollback;

    事務(wù)四大特性ACID

    原子性Atomicity:一組操作為最小執(zhí)行單元,只能全部執(zhí)行成功或者全部失敗

    一致性Consistency:事務(wù)完成后,所有數(shù)據(jù)都要保持一致狀態(tài)

    一致性表示事務(wù)完成后,數(shù)據(jù)操作前后符合邏輯運(yùn)算,狀態(tài)一致

    隔離性Isolation:是指在并發(fā)操作數(shù)據(jù)庫(kù)時(shí),各個(gè)事務(wù)之間不會(huì)相互影響

    持久性Durability:事務(wù)一旦提交或回滾,對(duì)于數(shù)據(jù)庫(kù)的修改將會(huì)永久保存

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

    臟讀

    兩個(gè)事務(wù)A和B在并發(fā)下操作數(shù)據(jù)庫(kù)中的同一數(shù)據(jù)時(shí),當(dāng)事務(wù)A對(duì)數(shù)據(jù)進(jìn)行了修改但是還沒有commit的同時(shí),事務(wù)B對(duì)該數(shù)據(jù)進(jìn)行了select,此時(shí)事務(wù)B讀取到的數(shù)據(jù)就是不準(zhǔn)確的。這種情況叫做臟讀

    事務(wù)B讀取到了事務(wù)A修改但還未提交的數(shù)據(jù)---->臟讀

    MySQL事務(wù)與隔離級(jí)別如何使用

    不可重復(fù)讀

    同樣事務(wù)AB并發(fā)下操作數(shù)據(jù)庫(kù)中同一數(shù)據(jù),首先事務(wù)A對(duì)該數(shù)據(jù)進(jìn)行查詢,查詢之后又進(jìn)行了其他操作。與此同時(shí),事務(wù)B執(zhí)行了更新操作并且成功commit。那么當(dāng)事務(wù)A再次對(duì)數(shù)據(jù)庫(kù)查詢的時(shí)候就會(huì)出現(xiàn)與上次讀取到的數(shù)據(jù)不一致的情況

    MySQL事務(wù)與隔離級(jí)別如何使用

    幻讀

    事務(wù)AB并發(fā)下操作數(shù)據(jù)庫(kù)中同一數(shù)據(jù),事務(wù)A首先查詢了數(shù)據(jù)庫(kù)中是否有id=1的數(shù)據(jù),沒有就插入。那么此時(shí)事務(wù)A未查詢到該數(shù)據(jù)存在,同時(shí)事務(wù)B執(zhí)行了插入操作插入了id=1的數(shù)據(jù)并且提交。那么事務(wù)A再去插入的時(shí)候則會(huì)報(bào)主鍵沖突的錯(cuò)誤,但是當(dāng)事務(wù)A再一次去查的時(shí)候發(fā)現(xiàn)id=1的數(shù)據(jù)仍然是不存在( 前提是已經(jīng)解決了不可重復(fù)讀的問題,一個(gè)事務(wù)多次訪問同一數(shù)據(jù)的結(jié)果是一致的 ),這種情況就稱之為幻讀

    MySQL事務(wù)與隔離級(jí)別如何使用

    事務(wù)隔離級(jí)別

    隔離級(jí)別

    隔離級(jí)別臟讀不可重復(fù)讀幻讀
    Read uncommitted(讀未提交)×××
    Read committed(oracle默認(rèn))(讀已提交)√××
    Repeatable Read(mysql默認(rèn))(可重復(fù)讀)√√×
    Serializable(可序化)√√√

    × --> 無(wú)法解決 √ --> 可以解決

    在sql中查看當(dāng)前事務(wù)隔離級(jí)別

    select @@transaction_isolation;

    設(shè)置當(dāng)前事務(wù)隔離級(jí)別

    -- 設(shè)置事務(wù)隔離級(jí)別
    set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};

    session是指盡在當(dāng)前會(huì)話中使用該事務(wù)隔離級(jí)別,global表示全局有效

    四種事務(wù)隔離級(jí)別當(dāng)中,Serializable可序化級(jí)別最高。要求序列化執(zhí)行sql指令,事務(wù)只能一個(gè)接一個(gè)的執(zhí)行,不允許并發(fā)執(zhí)行。性能低下,而Read Uncommitted讀未提交性能最好,但是存在臟讀問題等。

    關(guān)于“MySQL事務(wù)與隔離級(jí)別如何使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI