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

MySQL并發(fā)事務(wù)問題及隔離級別操作演示(附詳細(xì)圖文)

 更新時間:2025年08月28日 08:33:11   作者:學(xué)Java的小半  
在高并發(fā)環(huán)境下,數(shù)據(jù)庫事務(wù)操作可能引發(fā)臟讀、不可重復(fù)讀、幻讀和丟失更新等數(shù)據(jù)一致性問題,這篇文章主要介紹了MySQL并發(fā)事務(wù)問題及隔離級別操作演示的相關(guān)資料,需要的朋友可以參考下

舉例演示了MySQL的并發(fā)事務(wù)問題,以及四個事務(wù)隔離級別的區(qū)別,例子直接跳轉(zhuǎn)標(biāo)題3.

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

(1)臟讀 (Dirty Read)

  • 問題描述:一個事務(wù)讀取了另一個未提交事務(wù)修改過的數(shù)據(jù)

  • 示例

    • 事務(wù)A修改了某行數(shù)據(jù)但未提交

    • 事務(wù)B讀取了事務(wù)A修改后的數(shù)據(jù)

    • 事務(wù)A回滾,事務(wù)B讀取的數(shù)據(jù)就是無效的"臟數(shù)據(jù)"

(2)不可重復(fù)讀 (Non-repeatable Read)

  • 問題描述:在同一事務(wù)內(nèi),多次讀取同一數(shù)據(jù)返回不同結(jié)果(因為其他事務(wù)修改并提交了該數(shù)據(jù))

  • 示例

    • 事務(wù)A第一次讀取某行數(shù)據(jù)

    • 事務(wù)B修改了該行數(shù)據(jù)并提交

    • 事務(wù)A再次讀取同一行數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已改變

(3) 幻讀 (Phantom Read)

  • 問題描述:在同一事務(wù)內(nèi),多次查詢返回不同的行集合(因為其他事務(wù)新增或刪除了數(shù)據(jù))

  • 示例

    • 事務(wù)A查詢表中符合某條件的行

    • 事務(wù)B插入新的符合該條件的行并提交

    • 事務(wù)A再次查詢,發(fā)現(xiàn)多出了"幻影行"

2.事務(wù)隔離級別

我們可以通過給事務(wù)設(shè)置隔離級別來解決上述并發(fā)問題

MySQL 提供了四種隔離級別

隔離級別臟讀不可重復(fù)讀幻讀說明
READ UNCOMMITTED (讀未提交)可能可能可能最低隔離級別,性能最好但問題最多
READ COMMITTED (讀已提交)可能可能不可能只讀取已提交的數(shù)據(jù),Oracle默認(rèn)級別
REPEATABLE READ (可重復(fù)讀)可能不可能不可能MySQL默認(rèn)級別,確保同一事務(wù)內(nèi)讀取一致
SERIALIZABLE (串行化)不可能不可能不可能最高隔離級別,性能最差但最安全

事務(wù)隔離級別的相關(guān)操作

查看當(dāng)前隔離級別

SELECT @@transaction_isolation;
-- 或
SHOW VARIABLES LIKE 'transaction_isolation';

設(shè)置隔離級別

可以設(shè)置全局級別或會話級別:

-- 設(shè)置全局隔離級別
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 設(shè)置當(dāng)前會話隔離級別
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 設(shè)置下一個事務(wù)的隔離級別
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

3.操作演示

(1).準(zhǔn)備數(shù)據(jù)

首先,準(zhǔn)備一個簡單的數(shù)據(jù)表做演示

這里是一個簡單的賬戶表

create table account
(
    user_name varchar(20) not null,
    money     double      null,
    id        int auto_increment
        primary key
);

# 添加數(shù)據(jù)
insert into account values ('jack',8000,1),('mary',8000,2);

因為要演示并發(fā)問題,所以,我們直接使用cmd打開兩個窗口演示

找到 上面表所在的數(shù)據(jù)庫

(2).臟讀

我們先演示,臟讀:一個事務(wù)讀取了另一個未提交事務(wù)修改過的數(shù)據(jù)

先設(shè)置左窗口的事務(wù)隔離級別為  read uncommitted

set session transaction isolation level read uncommitted ;

然后在左窗開啟一個事務(wù),查詢一下 account表的數(shù)據(jù):

接著在右窗開啟一個事務(wù),修改 一下 account表的數(shù)據(jù):

注意,這時我們并沒有commit 提交右窗修改的數(shù)據(jù)

但是,我們再在左窗查詢 數(shù)據(jù),卻發(fā)現(xiàn)查詢到的數(shù)據(jù)已經(jīng)修改了

這就體現(xiàn)了臟讀問題,右窗的事務(wù),訪問到了左窗事務(wù)還未提交的數(shù)據(jù)!

演示完成,別忘了結(jié)束兩邊的事務(wù),再進(jìn)行后續(xù)操作

我們把右窗事務(wù)隔離級別修改為 readcommited 就可以避免臟讀問題

就是下面 不可重復(fù)讀的操作演示,不再贅述

右窗:

左窗:

(3.1).不可重復(fù)讀

右窗事務(wù)隔離級別設(shè)置為 readcommited

開啟一個事務(wù),查詢一下數(shù)據(jù)

在左窗開啟一個事務(wù),修改表中數(shù)據(jù)

左窗還未提交zai再次在右窗查詢,發(fā)現(xiàn)數(shù)據(jù)沒有變化,也就是解決了 臟讀問題

左窗提交數(shù)據(jù)后,再次在右窗查詢,發(fā)現(xiàn)數(shù)據(jù)變化了,

在右窗的一個事務(wù)過程中,出現(xiàn)了多次讀取同一數(shù)據(jù)但返回不同結(jié)果的現(xiàn)象,這就是不可重復(fù)讀

(3.2).解決不可重復(fù)讀

 設(shè)置右窗事務(wù)隔離級別為REPEATABLE READ (可重復(fù)讀), 開啟一個事務(wù),查詢當(dāng)前表數(shù)據(jù)

左窗還是開啟一個事務(wù),修改表中數(shù)據(jù),這次我們直接提交!

右窗再次查詢表數(shù)據(jù),可以看到,這次左窗事務(wù)雖然已經(jīng)提交了修改,但是右窗查詢數(shù)據(jù)還是沒變。這樣一個事務(wù)里就不會出現(xiàn)多次讀取同一數(shù)據(jù)但返回不同結(jié)果的現(xiàn)象,這就解決了上面 不可重復(fù)的的問題

我們結(jié)束右窗事務(wù)后,再次查詢,則看到了最新數(shù)據(jù)

(4.1).幻讀

右窗不改變隔離級別,依舊為  repeatable read 

開啟新事務(wù),查詢id為3的信息,當(dāng)前沒有id為3的人,當(dāng)然查詢不到

此時,左窗開啟一個事務(wù),插入id= 3的一條數(shù)據(jù) ,并直接提交

由于,并發(fā)執(zhí)行,之前右窗沒有查詢到id= 3的數(shù)據(jù),于是也準(zhǔn)備插入一條id= 3的數(shù)據(jù),但是由于左窗已經(jīng)插入完成,所以無法插入。如下圖

右窗再次查詢id為3的信息,但是還是查詢不到

像這樣右窗這樣,查詢時查詢不到,插入時又認(rèn)為數(shù)據(jù)已經(jīng)存在不讓插入 的現(xiàn)象 就叫 幻讀

(4.2).解決幻讀

設(shè)置右窗事務(wù)隔離級別為SERIALIZABLE (串行化),開啟事務(wù),查詢id= 4的數(shù)據(jù),沒有

左窗開啟事務(wù),插入id= 4的一條數(shù)據(jù),但是按回車后,卻沒有運行,這就是因為 右窗事務(wù)隔離級別為SERIALIZABLE (串行化)

  • 所有事務(wù)只能串行執(zhí)行,解決了所有并發(fā)問題

只能在右窗執(zhí)行完當(dāng)前事務(wù)的全部操作后,左窗事務(wù)才能繼續(xù)!

左窗:

總結(jié)

到此這篇關(guān)于MySQL并發(fā)事務(wù)問題及隔離級別操作演示的文章就介紹到這了,更多相關(guān)MySQL并發(fā)事務(wù)及隔離級別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析

    深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析

    本篇文章是對mysql "ON DUPLICATE KEY UPDATE"語法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL在讀已提交和可重復(fù)讀這兩個不同事務(wù)隔離級別下幻讀的區(qū)別及說明

    MySQL在讀已提交和可重復(fù)讀這兩個不同事務(wù)隔離級別下幻讀的區(qū)別及說明

    這篇文章主要介紹了MySQL在讀已提交和可重復(fù)讀這兩個不同事務(wù)隔離級別下幻讀的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Docker搭建MySQL數(shù)據(jù)庫的完整步驟及報錯解決

    Docker搭建MySQL數(shù)據(jù)庫的完整步驟及報錯解決

    使用Docker部署MySQL數(shù)據(jù)庫是一種高效且便捷的方法,這篇文章主要介紹了Docker搭建MySQL數(shù)據(jù)庫的完整步驟及報錯解決,文中通過代碼介紹介紹的非常詳細(xì),需要的朋友可以參考下
    2025-07-07
  • mysql 刪除操作(delete+TRUNCATE)

    mysql 刪除操作(delete+TRUNCATE)

    這篇文章主要介紹了mysql 刪除操作,主要包括了delete與TRUNCATE的使用,需要的朋友可以參考下
    2014-11-11
  • mysql免安裝版配置教程

    mysql免安裝版配置教程

    這篇文章主要為大家詳細(xì)介紹了mysql免安裝版配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 非常實用的MySQL函數(shù)全面總結(jié)詳解示例分析教程

    非常實用的MySQL函數(shù)全面總結(jié)詳解示例分析教程

    這篇文章主要為大家介紹了非常實用的MySQL函數(shù)的詳解示例分析,文中全面的概括了MySQL函數(shù),并進(jìn)行了詳細(xì)的示例講解,有需要的朋友可以借鑒參考下
    2021-10-10
  • 解讀mysql中的null問題

    解讀mysql中的null問題

    這篇文章主要介紹了解讀mysql中的null問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql 教程 存儲過程

    mysql 教程 存儲過程

    最近用mysql + asp.net來寫網(wǎng)站,既然mysql已經(jīng)支持存儲過程了,那么像分頁這么常用的東西,當(dāng)然要用存儲過程啦
    2009-06-06
  • Mysql 5.7.9 shutdown 語法實例詳解

    Mysql 5.7.9 shutdown 語法實例詳解

    之前如果想關(guān)閉一個mysql數(shù)據(jù)庫可以通過kill 命令、mysqladmin shutdown 、service mysqld stop 等這樣的方式。然而在mysql-5.7.9之后mysql終于提供了SQL接口的shutdown語法啦
    2017-06-06
  • MySQL?ENUM一個字段引發(fā)的故障踩坑實錄

    MySQL?ENUM一個字段引發(fā)的故障踩坑實錄

    Mysql中的enum類型就是我們常說的枚舉類型,它的取值范圍需要在創(chuàng)建表時通過枚舉方式(一個個的列出來)顯式指定,這篇文章主要介紹了MySQL?ENUM一個字段引發(fā)的故障踩坑實錄的相關(guān)資料,需要的朋友可以參考下
    2026-01-01

最新評論

犍为县| 达尔| 柳林县| 淳化县| 赣州市| 东莞市| 文山县| 军事| 兴隆县| 新乡市| 宜黄县| 三明市| 信阳市| 宝丰县| 兰考县| 仪征市| 若羌县| 贵港市| 浙江省| 前郭尔| 陆丰市| 正镶白旗| 贵溪市| 岫岩| 文登市| 区。| 城口县| 阿荣旗| 建水县| 开原市| 双流县| 玉龙| 桐城市| 庄浪县| 珲春市| 祁东县| 庆阳市| 星座| 贡山| 辽阳市| 密山市|