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

您的位置:首頁技術文章
文章詳情頁

一文帶你搞懂MySQL的事務隔離級別

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

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

可以說,事務的存在都是為了防止并發問題,我們的MySQL數據庫可以同時接受多個client連接,即支持同時多個事務處理,當多個事務同時進行的時候,可能會出現以下等問題:

臟寫(dirty write)

臟讀(dirty read)

不可重復讀(non-repeatable read)

幻讀(phantom read)

1.1 臟寫

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

舉個例子, 現在有一張表:

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)

現在有兩個事務,事務A和事務B,事務A是給Tom賬戶余額加100,事務B是給Tom賬戶余額加200。

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

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

1.2 臟讀

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

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

1.3 不可重復讀

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

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

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

當事務B繼續讀取Tom賬戶余額的時候,發現Tom賬戶余額是200了,和之前讀取到的不一致,對于事務B而言,這種一個事務內多次讀取得到不一樣值的現象就稱為不可重復讀 現象。

1.4 幻讀

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

最經典的是插入的情況。假如現在有兩個事務,事務A和事務B。事務A對某些行的內容作了更改,但是還未提交。

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

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

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

update bank_balance set wealth = 1 where balance > 0;

SQL語句只是執行了,但是未提交。

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

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

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

這對于事務A而言,感覺出現了幻覺一樣,這就是幻讀現象。

1.5 區別

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

1、臟讀重在指一個事務讀到了其他事務未提交的數據。

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

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

二、事務隔離級別

前面已經講完并行事務可能出現的問題,具體表象就是臟寫,臟讀,不可重復讀,幻讀。

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

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

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

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

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

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

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

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

為什么MySQL沒有使用串行化這個級別?是不是意味著我們日常使用MySQL會有可能存在幻讀的問題?

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

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

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

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

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

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

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

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

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

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

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

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

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

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本精品一区二区三区在线观看视频| 激情久久一区二区| 激情偷拍久久| 国产高清日韩| 欧美日韩激情| 日韩午夜免费| 日韩在线观看一区| 精品久久久久久久| 欧美激情亚洲| 欧美国产专区| 欧美在线精品一区| 亚洲一级在线| 91精品国产成人观看| 老司机精品视频网| 日韩国产在线| 亚洲+小说+欧美+激情+另类| 欧美极品一区二区三区| 国产成人免费精品| 欧美精选视频一区二区| 国产真实久久| 日韩久久99| 美女视频黄免费的久久| 免费在线播放第一区高清av| 国产成人久久精品一区二区三区| 丁香婷婷久久| 亚洲精品.com| 日韩午夜av在线| 日韩中文字幕1| 日韩av在线播放网址| 激情婷婷亚洲| 亚洲欧美日本国产| 欧美激情麻豆| 欧美日韩国产亚洲一区| 视频一区日韩精品| 欧美黑人巨大videos精品| www.九色在线| 伊人久久亚洲美女图片| 亚洲精品一级二级| 日韩在线观看一区二区| 日韩三级一区| av日韩中文| 好吊视频一区二区三区四区| 亚洲精选久久| 精品视频免费| 亚洲人亚洲人色久| 88久久精品| 视频一区二区欧美| 久久永久免费| 蜜桃一区二区三区在线| 鲁大师精品99久久久| 水蜜桃久久夜色精品一区的特点| 麻豆精品蜜桃| 91亚洲人成网污www| 日韩激情一区二区| 福利一区和二区| 欧美日韩国产在线观看网站| 亚洲欧洲美洲国产香蕉| 日韩国产在线观看| 久久伦理在线| 日韩欧美字幕| 精品国模一区二区三区| 91伊人久久| 国产精品99一区二区三区| 日韩av不卡一区二区| 亚洲国产专区| 日韩不卡在线| 日本成人一区二区| 水蜜桃精品av一区二区| 国产欧美三级| 免播放器亚洲| 尤物网精品视频| 不卡在线一区| 日韩精品一区二区三区av | 亚洲资源在线| 丝袜国产日韩另类美女| 免费观看亚洲天堂| 亚洲精品免费观看| 91久久久精品国产| 欧美成人基地| 美女网站视频一区| 视频在线不卡免费观看| 久久久久91| 岛国av在线网站| 日韩中文av| 视频一区在线视频| 久久精品国产99国产| 亚洲精品无播放器在线播放| 红桃视频国产精品| 精品在线播放| 国产91精品对白在线播放| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日本视频在线一区| 精品三区视频| 成人精品亚洲| 中文字幕一区二区三区日韩精品| 亚洲精品看片| 丝袜诱惑制服诱惑色一区在线观看| 欧美成人精品| 麻豆91精品| 成人精品高清在线视频| 欧美肉体xxxx裸体137大胆| 亚洲一区二区三区高清不卡| 亚洲欧美日韩精品一区二区 | 综合一区在线| 日本91福利区| 久久一区视频| 久久香蕉国产| 日韩精品三级| 国产精品成人a在线观看| 免费成人av在线播放| 久久av综合| 国产在线|日韩| 亚洲网址在线观看| 日韩成人一级| 99精品综合| 久久婷婷一区| 日韩av一区二区三区| 麻豆91小视频| 国产一区二区三区四区大秀| 久久精品中文| 国产乱码精品一区二区三区亚洲人 | 视频在线观看一区| 久久免费黄色| 欧美成人基地| 欧美一级一区| 日韩欧美精品一区| 久久亚洲美女| 久久天堂av| 国产精品yjizz视频网| 日韩av电影一区| 亚洲成人免费| 亚洲成人不卡| 国产日韩一区二区三免费高清| 久久久五月天| 国产精品一卡| 999国产精品999久久久久久| 日韩一区二区三免费高清在线观看 | 欧美在线日韩| 午夜精品影院| 成人三级高清视频在线看| 五月婷婷六月综合| 超级白嫩亚洲国产第一| 国语精品一区| 日韩久久99| 亚洲一级大片| 视频一区二区中文字幕| 日韩伦理在线一区| 精品国产成人| 国产精品入口久久| 久久中文视频| 国产成人精品一区二区三区免费 | 日韩免费久久| 亚洲作爱视频| 妖精视频成人观看www| 婷婷成人av| av免费不卡国产观看| 亚洲欧美激情诱惑| 国产一区二区三区久久| 视频一区二区中文字幕| 国产一区日韩一区| 日本vs亚洲vs韩国一区三区二区| 婷婷五月色综合香五月| 在线综合亚洲| 国产精品s色| 精品欧美激情在线观看| 美国欧美日韩国产在线播放| 久久久久观看| 国产精品普通话对白| 福利精品一区| 日韩 欧美一区二区三区| 日韩一区二区三区免费| 国产精久久久| 丝瓜av网站精品一区二区| 亚洲黄色中文字幕| 日韩精品亚洲专区在线观看| 蜜桃av.网站在线观看| 美女国产一区| 欧美特黄一区| 国产精品久久久久久久久久白浆 | 一本大道色婷婷在线| 日韩精品高清不卡| 日韩一区二区久久| 久久精品国产www456c0m| 国产一区二区三区不卡视频网站| 午夜免费一区| 中文字幕在线视频网站| 日韩av中文在线观看| 伊人久久大香线蕉av不卡| 国产日韩中文在线中文字幕 | 欧美视频二区| 亚洲一区欧美激情| 欧美一区久久久| 青草综合视频| 国产精品任我爽爆在线播放| 日韩亚洲在线| 亚洲午夜久久| 亚洲三级毛片| 国产精品毛片一区二区三区| 美女网站视频一区| 麻豆国产精品视频|