日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

一文帶你搞懂MySQL的事務(wù)隔離級別

瀏覽:19日期:2023-07-20 19:52:12
目錄一、并行事務(wù)會有什么問題?1.1 臟寫1.2 臟讀1.3 不可重復(fù)讀1.4 幻讀1.5 區(qū)別二、事務(wù)隔離級別一、并行事務(wù)會有什么問題?

在講事務(wù)隔離級別之前,我們先想一下,如果有多個事務(wù)并行執(zhí)行,MySQL數(shù)據(jù)最終會有什么問題?

可以說,事務(wù)的存在都是為了防止并發(fā)問題,我們的MySQL數(shù)據(jù)庫可以同時接受多個client連接,即支持同時多個事務(wù)處理,當(dāng)多個事務(wù)同時進行的時候,可能會出現(xiàn)以下等問題:

臟寫(dirty write)

臟讀(dirty read)

不可重復(fù)讀(non-repeatable read)

幻讀(phantom read)

1.1 臟寫

臟寫 *(dirty write) *,直白說就是兩個事務(wù)同時更新一行數(shù)據(jù),事務(wù)A回滾把事務(wù)B的值覆蓋了,實質(zhì)就是兩個未提交的事務(wù)互相影響。

舉個例子, 現(xiàn)在有一張表:

CREATE TABLE `bank_balance` ( `id` int NOT NULL AUTO_INCREMENT, `user_name` varchar(45) NOT NULL COMMENT '用戶名', `balance` int NOT NULL DEFAULT '0' COMMENT '余額,單位:人民幣分,比如100表示人民幣1元,默認是0', `wealth` tinyint NOT NULL DEFAULT '0' COMMENT '富有程度,0:貧窮,1:富有', PRIMARY KEY (`id`), UNIQUE KEY `idx_bank_balance_user_name` (`user_name`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

表中有一行id=3 且 user_name=Tom的記錄:

mysql> select id,user_name,balance from bank_balance where user_name = 'Tom';+----+-----------+---------+| id | user_name | balance |+----+-----------+---------+| 3 | Tom | 100 |+----+-----------+---------+1 row in set (0.00 sec)

現(xiàn)在有兩個事務(wù),事務(wù)A和事務(wù)B,事務(wù)A是給Tom賬戶余額加100,事務(wù)B是給Tom賬戶余額加200。

在①處,事務(wù)A得到的余額是200,事務(wù)B得到的余額是300,如果事務(wù)B是后更新,那么就覆蓋了事務(wù)A的值。

在②處,事務(wù) A 和事務(wù)B都沒有提交的情況下,它們隨時都有可能發(fā)生回滾,如上圖這種情況事務(wù) A 發(fā)生了回滾,然后事務(wù)B再提交,那么對于事務(wù) B 看到的場景而言,就是自己明明更新了,結(jié)果值卻還是舊值,這就是 臟寫 。

1.2 臟讀

*臟讀(dirty read) ****, ***指的是讀到了其他事務(wù)未提交的數(shù)據(jù),未提交意味著可能會回滾,也就是可能最終不會持久化到數(shù)據(jù)庫中。其他事務(wù)讀到了不會持久化的數(shù)據(jù),這就是臟讀。

比如下圖,如果事務(wù)A在①處發(fā)生回滾,那么事務(wù)B在②處使用的Tom余額值200就是一個過期值,這種就是典型的 臟讀現(xiàn)象。

1.3 不可重復(fù)讀

*不可重復(fù)讀(non-repeatable read) *,指的是在同一事務(wù)內(nèi),相同數(shù)據(jù)在不同的時刻被讀到了不一樣的值,它和臟讀不一樣,臟讀是指讀取到了其他事務(wù)未提交的數(shù)據(jù),而不可重復(fù)讀表示讀到了其他事務(wù)修改并提交后的值。

比如有兩個事務(wù),事務(wù)A和事務(wù)B,事務(wù)A查詢Tom賬戶余額是100,事務(wù)B查詢Tom賬戶余額也是100。

接下來,事務(wù)A把Tom賬戶余額更新為200,并提交事務(wù)。

當(dāng)事務(wù)B繼續(xù)讀取Tom賬戶余額的時候,發(fā)現(xiàn)Tom賬戶余額是200了,和之前讀取到的不一致,對于事務(wù)B而言,這種一個事務(wù)內(nèi)多次讀取得到不一樣值的現(xiàn)象就稱為不可重復(fù)讀 現(xiàn)象。

1.4 幻讀

*幻讀(phantom read) *,主要是是針對數(shù)據(jù)插入(INSERT)和刪除(DELETE)操作來說的。

最經(jīng)典的是插入的情況。假如現(xiàn)在有兩個事務(wù),事務(wù)A和事務(wù)B。事務(wù)A對某些行的內(nèi)容作了更改,但是還未提交。

比如現(xiàn)在余額表中余額大于0的賬戶有2條,分別是小克和Tom,他們的富有程度都是貧窮:

mysql> select *from bank_balance where balance > 0;+----+-----------+-----------+--------+| id | user_name | balance | wealth |+----+-----------+-----------+--------+| 2 | 小克 | 300000000 | 0 || 3 | Tom | 100 | 0 |+----+-----------+-----------+--------+

然后,接到上級命令,要把所有賬戶余額大于0的用戶全部標識為富有,啟動事務(wù)A完成這項任務(wù),SQL如下:

update bank_balance set wealth = 1 where balance > 0;

SQL語句只是執(zhí)行了,但是未提交。

緊接著,事務(wù)B插入了一條余額大于0的記錄行(富有程度默認為貧窮),并且在事務(wù)A提交之前先提交了,SQL如下:

INSERT INTO `bank_balance` (`id`, `user_name`, `balance`) VALUES ('4', 'Eric', '500');

在這之后,如果事務(wù)A再發(fā)起相同條件的查詢,會發(fā)現(xiàn)剛剛的更改對于某些數(shù)據(jù)未起作用(有些記錄未被標識為富有),而且數(shù)據(jù)行比原來還多了!

這對于事務(wù)A而言,感覺出現(xiàn)了幻覺一樣,這就是幻讀現(xiàn)象。

1.5 區(qū)別

讀到這里,可能有些小伙伴就懵了,從臟讀到幻讀,感覺它們都一樣的呀?其實,它們有實質(zhì)性的區(qū)別:

1、臟讀重在指一個事務(wù)讀到了其他事務(wù)未提交的數(shù)據(jù)。

2、不可重復(fù)讀主要在于一個事務(wù)中多次讀到同一條數(shù)據(jù),但前后讀到的結(jié)果不一樣,這是因為其他事務(wù)對數(shù)據(jù)進行修改并提交導(dǎo)致。

3、幻讀則是因為被其他事務(wù)插入或者刪除的數(shù)據(jù)影響,一個事務(wù)內(nèi)同樣條件的數(shù)據(jù)記錄變多或者變少了。

二、事務(wù)隔離級別

前面已經(jīng)講完并行事務(wù)可能出現(xiàn)的問題,具體表象就是臟寫,臟讀,不可重復(fù)讀,幻讀。

針對這些問題,SQL定了一套標準,通過 隔離 來規(guī)避,且不同級別的隔離可以規(guī)避不同嚴重程度的事務(wù)問題,下面,我們一起看下SQL事務(wù) 隔離級別 都有哪些:

*讀未提交(READ UNCOMMITTED) *,指一個事務(wù)還沒提交,它做的修改就能被其他事務(wù)看到。

讀提 *交(READ COMMITTED) *,一個事務(wù)做的修改,只有提交之后,其他事務(wù)才能看到。

*可重復(fù)讀(REPEATABLE READ) *,在整個事務(wù)過程中看到的數(shù)據(jù),自始至終都是一致的。

*串行化(SERIALIZABLE) *,每個讀寫操作都會加鎖,多個事務(wù)要訪問同一條記錄時,必須要進行排隊,優(yōu)先級低的事務(wù)必須等優(yōu)先級高的事務(wù)完成以后才能進行。

從1到4,隔離級別依次變高,當(dāng)然,性能也依次變差。那么這些隔離級別究竟都能防止哪些問題呢?來看一個表格:

只有串行化的隔離級別解決了全部這 3 個問題,其他的 3 個隔離級別都有一定的缺陷。

但,MySQL InnoDB引擎默認的隔離級別是可重復(fù)讀(RR) 。

為什么MySQL沒有使用串行化這個級別?是不是意味著我們?nèi)粘J褂肕ySQL會有可能存在幻讀的問題?

非也! 隔離級別越高代價也是越高的 ,且性能也越差。從性能上來說,當(dāng)然是隔離級別越低越好。

至于隔離級別是RR(可重復(fù)讀)下的MySQL怎么避免幻讀問題,InnoDB引擎有它自己的想法,以后單獨抽一講來說啦~

我們再來看一張圖,理解不同隔離級別下讀取到的數(shù)據(jù)是怎么樣的:

有兩個事務(wù),事務(wù)A和事務(wù)B,同時操作(查詢或者給Tom余額加100),事務(wù)B在事務(wù)A提交前更新了Tom的余額,并且事務(wù)B在事務(wù)A前提交。

讀未提交隔離級別 下,事務(wù) B 修改余額后,事務(wù) A 能夠馬上看見,即使事務(wù)B還未提交,所以事務(wù) A 中余額 R1 查詢的值是 200,余額 R2、R3 也是 200.

讀提交隔離級別 下,事務(wù) B 修改余額后,只有事務(wù)B提交后事務(wù)A才能看見,所以事務(wù)A中余額R1查詢在提交前,查的值是100,余額R2和余額R3都是在事務(wù)B提交后,查詢得到的值都是200。

可重復(fù)讀隔離級別 下,事務(wù)A在提交前自始至終查到的值都必須一樣,所以,余額R1、R2都是100,當(dāng)事務(wù)A提交后再查詢(其實是新事務(wù))就能查到新的值,所以R3是200。

串行化隔離級別 下,MySQL會給記錄行以及記錄行之間的'空行'加鎖,如果是A事務(wù)先獲得鎖,那么B事務(wù)必須等到A事務(wù)提交以后才能更新數(shù)據(jù)。

比如上圖,如果事務(wù)A查詢Tom余額的SQL條件是'where user_name = "Tom"', user_name有唯一索引,所以只會給Tom賬戶這一行數(shù)據(jù)加共享鎖 。

當(dāng)B事務(wù)要去更新Tom的賬戶余額時,是獲取不到鎖的, 必須等待直至事務(wù)A完全提交 。

所以以上R1、R2查詢得到的值都是100(這個時候事務(wù)B在排隊等待),事務(wù)A提交以后, 事務(wù)B就可以更新值并提交了,R3是在事務(wù)B提交之后查詢,所以是200。

好啦,今天就先講到這里啦。

到此這篇關(guān)于一文帶你搞懂MySQL的事務(wù)隔離級別的文章就介紹到這了,更多相關(guān)MySQL事務(wù)隔離級別內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
激情欧美一区| 欧美亚洲国产激情| 亚洲欧美日韩国产一区| 精品亚洲美女网站| 久久久久久色 | 婷婷激情图片久久| 成人久久一区| 伊人久久亚洲影院| 美女久久一区| 亚洲不卡视频| 国产精品一区二区三区www| 亚洲三级网站| 国产日韩欧美一区在线| 国产精品久久久网站| 国产精品白浆| 国产a久久精品一区二区三区| 视频在线不卡免费观看| 久久久久久美女精品| 婷婷色综合网| 亚洲精品视频一二三区| 国产精品天天看天天狠| 国产精品成人一区二区不卡| 91精品国产91久久久久久黑人| 99在线精品免费视频九九视| 亚洲最新av| 国产精品毛片久久久| 粉嫩av一区二区三区四区五区 | 欧美一区二区三区高清视频 | 九一成人免费视频| 美女黄网久久| 欧美在线91| 97在线精品| 亚州av乱码久久精品蜜桃| 伊人国产精品| 国产麻豆一区二区三区| 风间由美中文字幕在线看视频国产欧美| www.九色在线| 免费毛片在线不卡| 亚洲精品在线二区| 国产一区二区三区精品在线观看| 久久婷婷一区| 亚洲我射av| 国产成人精品免费视| 尤物在线精品| 国产日韩欧美一区二区三区在线观看 | 国产精品porn| 欧美一区二区三区高清视频| 日韩在线黄色| 激情国产在线| 亚洲成人精选| 欧美色综合网| 欧美一区二区三区激情视频| 欧美亚洲色图校园春色| 日本少妇一区| 欧美午夜三级| 国产精品97| 久久亚洲黄色| 蜜桃久久精品一区二区| 日本一区二区高清不卡| 丝袜亚洲精品中文字幕一区| 精品免费视频| 蜜桃av一区| 91青青国产在线观看精品| 综合激情网...| 国产精品99一区二区三| 亚洲精品乱码| 亚洲第一精品影视| 国产精品**亚洲精品| av亚洲免费| 国产在线一区不卡| 日韩av中文在线观看| 精品欧美激情在线观看| 麻豆国产精品一区二区三区| 久久成人国产| 日韩美女一区二区三区在线观看| 日韩一二三区在线观看| 欧美va天堂在线| 国产一区二区三区不卡av| 日韩精品高清不卡| 999国产精品永久免费视频app| 国产精品入口久久| 蜜臀av国产精品久久久久| 成人午夜精品| 卡一卡二国产精品| 色8久久久久| 国产精品毛片在线看| 日韩电影二区| 九九99久久精品在免费线bt| 日韩精品久久久久久| 免费久久99精品国产| 久久久久免费av| av中文字幕在线观看第一页| 国产免费av国片精品草莓男男| 亚洲欧美一级| 国产综合婷婷| 日韩欧美三级| 国产中文欧美日韩在线| 国产三级一区| 少妇精品在线| 亚洲五月综合| 久久国产精品久久久久久电车| 久久久天天操| 狠狠久久伊人中文字幕| 国产精品亚洲欧美| 国产日韩高清一区二区三区在线 | 日韩高清不卡在线| 只有精品亚洲| 激情91久久| 欧美亚洲精品在线| 久久久久国产精品一区二区| av资源亚洲| 久久电影tv| 福利精品一区| 国产在线日韩精品| 91亚洲国产高清| 青青青免费在线视频| 中文一区一区三区高中清不卡免费| 国产精品国产三级在线观看| 国产高清视频一区二区| 国产伦理久久久久久妇女| 91九色综合| 久久国产精品免费一区二区三区| 日本欧美韩国一区三区| 欧美另类中文字幕| 国产麻豆一区二区三区精品视频| 久久精品凹凸全集| 国产剧情一区二区在线观看| 国产精品黄网站| 精品美女视频| 国产伦久视频在线观看| 热三久草你在线| 黄色不卡一区| 亚洲综合丁香| 婷婷综合成人| 国产精品第一| 激情国产在线| 欧美久久精品一级c片| 亚洲一区欧美二区| 亚洲综合激情在线| 久久国产精品免费一区二区三区 | 国产精品九九| 国产不卡精品| 99热精品久久| 伊人久久亚洲热| 天堂久久一区| 国产精品s色| 欧美三级网址| 国产亚洲午夜| 欧美日韩一区二区国产| 国语精品一区| 九九在线精品| 日韩精品免费一区二区夜夜嗨 | 日本中文字幕一区二区| 国产欧美大片| 欧美羞羞视频| 亚洲一区亚洲| 欧美一区=区三区| 成人污污视频| 夜夜嗨一区二区| 国产欧美激情| 99精品在线| 亚洲综合色婷婷在线观看| 国产精品18| 国产伊人精品| 日本欧美久久久久免费播放网| 国产999精品在线观看 | 久久高清免费| 自拍自偷一区二区三区| 国产精品欧美日韩一区| 日韩国产一区二区三区| 国产精品腿扒开做爽爽爽挤奶网站| 日本免费一区二区视频| 色综合狠狠操| 美国欧美日韩国产在线播放| 国产极品久久久久久久久波多结野 | 极品裸体白嫩激情啪啪国产精品| 亚洲小说春色综合另类电影| 91亚洲自偷观看高清| 亚洲一区二区三区四区五区午夜| 国产精品免费不| 黄色精品网站| 狂野欧美性猛交xxxx| 一区久久精品| 久久福利在线| 99在线观看免费视频精品观看| 久久中文字幕一区二区三区| 午夜电影亚洲| 久久精品人人| 中文不卡在线| 日本韩国欧美超级黄在线观看| 91成人在线| 在线 亚洲欧美在线综合一区| 久久不卡日韩美女| 国产亚洲网站| 国产超碰精品| 欧美激情网址| 亚洲精品国产日韩| 欧美影院三区| 成人精品国产亚洲| 日韩精品五月天|