日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql不支持python3吗_MySQL的4种事务隔离级别你还不清楚吗?

發(fā)布時(shí)間:2025/3/15 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql不支持python3吗_MySQL的4种事务隔离级别你还不清楚吗? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

現(xiàn)在想把數(shù)據(jù)庫這塊整理出來,盡量用最簡潔的語言描述出來,供新人參考。

首先創(chuàng)建一個(gè)表 account。創(chuàng)建表的過程略過(由于 InnoDB 存儲(chǔ)引擎支持事務(wù),所以將表的存儲(chǔ)引擎設(shè)置為 InnoDB)。表的結(jié)構(gòu)如下:

然后往表中插入兩條數(shù)據(jù),插入后結(jié)果如下:

為了說明問題,我們打開兩個(gè)控制臺(tái)分別進(jìn)行登錄來模擬兩個(gè)用戶(暫且成為用戶 A 和用戶 B 吧),并設(shè)置當(dāng)前 MySQL 會(huì)話的事務(wù)隔離級(jí)別。

一. read uncommitted(讀取未提交數(shù)據(jù))

具體用戶 A 的操作如下:

set session transaction isolation level read uncommitted; start transaction; select * from account;

結(jié)果如下:

用戶 B 的操作如下:

set session transaction isolation level read uncommitted; start transaction; update account set account=account+200 where id = 1;

隨后我們?cè)?A 用戶中查詢數(shù)據(jù),結(jié)果如下:

結(jié)論一

我們將事務(wù)隔離級(jí)別設(shè)置為 read uncommitted,即便是事務(wù)沒有 commit,但是我們?nèi)匀荒茏x到未提交的數(shù)據(jù),這是所有隔離級(jí)別中最低的一種

那么這么做有什么問題嗎?

那就是我們?cè)谝粋€(gè)事務(wù)中可以隨隨便便讀取到其他事務(wù)未提交的數(shù)據(jù),這還是比較麻煩的,我們叫臟讀。我不知道這個(gè)名字是怎么起的,為了增強(qiáng)大家的印象,可以這么想,這個(gè)事務(wù)好輕浮啊,饑渴到連別人沒提交的東西都等不及,真臟,呸!

實(shí)際上我們的數(shù)據(jù)改變了嗎?

答案是否定的,因?yàn)橹挥惺聞?wù) commit 后才會(huì)更新到數(shù)據(jù)庫。

二. read committed(可以讀取其他事務(wù)提交的數(shù)據(jù))--- 大多數(shù)數(shù)據(jù)庫默認(rèn)的隔離級(jí)別

同樣的辦法,我們將用戶 B 所在的會(huì)話當(dāng)前事務(wù)隔離級(jí)別設(shè)置為 read commited。

在用戶 A 所在的會(huì)話中我們執(zhí)行下面操作:

update account set account=account-200 where id=1;

我們將 id=1 的用戶 account 減 200。然后查詢,發(fā)現(xiàn) id=1 的用戶 account 變?yōu)?800。

在 B 用戶所在的會(huì)話中查詢:

  • select * from account;
  • 結(jié)果如下:

    我們會(huì)發(fā)現(xiàn)數(shù)據(jù)并沒有變,還是 1000。

    接著在會(huì)話 A 中我們將事務(wù)提交:

  • commit;
  • 在會(huì)話 B 中查詢結(jié)果如下:

    結(jié)論二:

    當(dāng)我們將當(dāng)前會(huì)話的隔離級(jí)別設(shè)置為 read committed 的時(shí)候,當(dāng)前會(huì)話只能讀取到其他事務(wù)提交的數(shù)據(jù),未提交的數(shù)據(jù)讀不到。

    那么這么做有什么問題嗎?

    那就是我們?cè)跁?huì)話 B 同一個(gè)事務(wù)中,讀取到兩次不同的結(jié)果。這就造成了不可重復(fù)讀,就是兩次讀取的結(jié)果不同。這種現(xiàn)象叫不可重復(fù)讀。

    三. repeatable read(可重讀)---MySQL 默認(rèn)的隔離級(jí)別

    現(xiàn)在有個(gè)需求,就是老板說在同一個(gè)事務(wù)中查詢結(jié)果必須保持一致,如果你是數(shù)據(jù)庫,你會(huì)怎么做?數(shù)據(jù)庫是這么做的。

    在會(huì)話 B 中我們當(dāng)前事務(wù)隔離級(jí)別為 repeatable read。具體操作如下:

    set session transaction isolation level repeatable read; start transaction;

    接著在會(huì)話 B 中查詢數(shù)據(jù):

    我們?cè)?A 用戶所在會(huì)話中為表 account 添加一條數(shù)據(jù):

    insert into account(id,account) value(3,1000); commit;

    然后我們查詢看數(shù)據(jù)插入是否成功:

    回到 B 用戶所在的會(huì)話,我們查詢結(jié)果:

    用戶 B 在他所在的會(huì)話中想插入一條新數(shù)據(jù) id=3,value=1000。來我們操作下:

    什么?竟然插不進(jìn)去,說我數(shù)據(jù)重復(fù)?

    用戶 B 當(dāng)然不服啊,因?yàn)椴樵兊綌?shù)據(jù)只有兩條啊,為什么插入 id=3 說我數(shù)據(jù)重復(fù)了呢?

    我再看一遍,莫非我眼花了?

    試想一下,在實(shí)際中用戶 A 和用戶 B 肯定是相互隔離的,彼此不知道操作什么。用戶 B 碰到這種現(xiàn)象,肯定會(huì)炸毛的啊,明明不存在的數(shù)據(jù),插入?yún)s說主鍵 id=3 數(shù)據(jù)重復(fù)了。

    結(jié)論三:

    當(dāng)我們將當(dāng)前會(huì)話的隔離級(jí)別設(shè)置為 repeatable read 的時(shí)候,當(dāng)前會(huì)話可以重復(fù)讀,就是每次讀取的結(jié)果集都相同,而不管其他事務(wù)有沒有提交。

    有什么問題嗎?

    管他呢,老板的要求滿足了。要一個(gè)事務(wù)中讀取的數(shù)據(jù)一致(可重復(fù)讀)。我只能這么做啊,打腫臉裝胖子。數(shù)據(jù)已經(jīng)發(fā)生改變,但是我還是要保持一致。但是,出現(xiàn)了用戶 B 面對(duì)的問題,這種現(xiàn)象叫幻讀(記得當(dāng)時(shí)就在這個(gè)地方糾結(jié)好久,到底什么是幻讀啊)。

    四. serializable(串行化)

    同樣,我們將用戶 B 所在的會(huì)話的事務(wù)隔離級(jí)別設(shè)置為 serializable 并開啟事務(wù)。

    set session transaction isolation level serializable; start transaction;

    在用戶 B 所在的會(huì)話中我們執(zhí)行下面操作:

    select * from account;

    結(jié)果如下:

    那我們這個(gè)時(shí)候在用戶 A 所在的會(huì)話中寫數(shù)據(jù)呢?

    我們發(fā)現(xiàn)用戶 A 所在的會(huì)話陷入等待,如果超時(shí)(這個(gè)時(shí)間可以進(jìn)行配置),會(huì)出現(xiàn) Lock wait time out 提示:

    如果在等待期間我們用戶 B 所在的會(huì)話事務(wù)提交,那么用戶 A 所在的事務(wù)的寫操作將提示操作成功。

    結(jié)論四:

    當(dāng)我們將當(dāng)前會(huì)話的隔離級(jí)別設(shè)置為 serializable 的時(shí)候,其他會(huì)話對(duì)該表的寫操作將被掛起。可以看到,這是隔離級(jí)別中最嚴(yán)格的,但是這樣做勢必對(duì)性能造成影響。所以在實(shí)際的選用上,我們要根據(jù)當(dāng)前具體的情況選用合適的。

    最后

    歡迎大家一起交流,喜歡文章記得關(guān)注我點(diǎn)個(gè)贊喲,感謝支持!

    總結(jié)

    以上是生活随笔為你收集整理的mysql不支持python3吗_MySQL的4种事务隔离级别你还不清楚吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。