国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

數據庫事務隔離級別怎么選?看完這篇你就懂了!

數據庫 MySQL
事務支持是在引擎層實現的,可能你知道,MySQL 是一個支持多引擎的系統,但并不是所有的引擎都支持事務,比如 MySQL 原生的 MyISAM 引擎就不支持事務,這也是 MyISAM 被 InnoDB 取代的重要原因之一。

一、背景介紹

事務隔離,是每場高級開發面試過程中,必不可少的一個重點環節。在上篇文章中,我們介紹了 Spring 的事務管理實踐,相信大家對它有了一個初步的認識,今天我們就一起來捋一捋數據庫的事務隔離機制。

說到事務,相信你一定不會陌生,在與數據庫打交道的時候,我們總是會用到它。

以轉賬為例,你要給朋友小張轉賬 100 元,而此時的銀行卡余額至少要有 100元。在轉賬過程中,程序會有一系列的操作,比如查詢余額、做加減法、更新余額等,這些操作必須保證是一體的。

不然等程序查完之后,還沒做扣減余額之前,你這 100 塊錢,完全可以借著這個時間差再查一次,然后再給另外一個朋友轉賬,如果程序真的這么搞,銀行不血虧才怪!

在整個程序更新數據過程中,這時就要用到“事務”這個概念了。

簡單的說,事務就是要保證一組數據庫操作,要么全部成功,要么全部失敗!

以 MySQL 為例,事務支持是在引擎層實現的,可能你知道,MySQL 是一個支持多引擎的系統,但并不是所有的引擎都支持事務,比如 MySQL 原生的 MyISAM 引擎就不支持事務,這也是 MyISAM 被 InnoDB 取代的重要原因之一。

下面將會以 InnoDB 為例,剖析 MySQL 在事務支持方面的特定實現,希望通過這些案例能加深你對 MySQL 事務原理的理解!

二、事務隔離機制介紹

提到事務,大家會不由自主的想到 ACID (Atomicity、Consistency、Isolation、Durability)四大特性,即:原子性、一致性、隔離性、持久性。

原子性、一致性很好理解,就是上文說道的,要么全部成功,要么全部失敗;持久性,也好理解,當數據發生變化時,能將最新的結果記錄到磁盤中永久保存;而隔離性,有點復雜,簡單的說,就是將事務彼此之間隔離開,當多個事務在同時處理一個數據時,彼此之間互相不影響。

如果隔離的不夠好,就有可能會產生臟讀、不可重復度、幻讀等讀現象。

為此,隔離性總共分為四種級別:由低到高依次為 Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決臟讀 、不可重復讀 、幻讀等這幾類問題。

  • read uncommitted:俗稱讀未提交,指的是一個事務還沒提交時,它做的變更就能被別的事務看到。
  • Read committed:俗稱讀提交,指的是一個事務提交之后,它做的變更才會被其他事務看到。
  • Repeatable read:俗稱可重復讀,指的是一個事務執行過程中看到的數據,總是跟這個事務在啟動時看到的數據是一致的,同時當其他事務在未提交時,變更是不可見的。
  • Serializable:俗稱串行化,顧名思義就是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行。

在這四個隔離級別中,其中“讀提交”和“可重復讀”比較難理解,下面我們以一個例子為案例,介紹這幾種隔離級別的區別!

假設數據表 T 中只有一列,其中一行的值為 1。

mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);

下面是按照時間順序執行兩個事務的行為。

圖片圖片

我們來看看在不同的隔離級別下,事務 A 會有哪些不同的返回結果,也就是圖里面 V1、V2、V3 的返回值分別是什么。

  • 若隔離級別是“讀未提交”, 則 V1 的值就是 2,這時候事務 B 雖然還沒有提交,但是結果已經被 A 看到了,因此,V1、V2、V3 也都是 2。
  • 若隔離級別是“讀提交”,則 V1 是 1,事務 B 的更新在提交后才能被 A 看到。所以, V2、V3 的值也是 2。
  • 若隔離級別是“可重復讀”,則 V1、V2 是 1,V3 是 2。之所以 V2 還是 1,遵循的就是這個要求:當前事務在執行期間看到的數據前后必須是一致的。
  • 若隔離級別是“串行化”,則在事務 B 執行“將 1 改成 2”的時候,會被鎖住。直到事務 A 提交后,事務 B 才可以繼續執行。所以從 A 的角度看, V1、V2 值是 1,V3 的值是 2。

為什么會產生這種情況呢,下面我們一起來分析一下!實現上,當開啟事務時,數據庫里面會創建一個視圖,訪問的時候以視圖的邏輯結果為準。

  • 在“讀提交”隔離級別下,這個視圖是在每個 SQL 語句開始執行的時候創建的。
  • 在“可重復讀”隔離級別下,這個視圖是在事務啟動時創建的,整個事務存在期間都用這個視圖。
  • 在“串行化”隔離級別下,直接用加鎖的方式來避免并行訪問。
  • 而在“讀未提交”隔離級別下,直接返回記錄上的最新值,沒有視圖概念。

因此,在不同的隔離級別下,數據庫行為是有所不同的,比如 Mysql 數據庫的默認隔離級別就是“可重復讀”,而 oracle、pgsql 數據庫的默認隔離級別是“讀提交”。

因此對于一些從 Oracle 遷移到 MySQL 的應用,為保證數據庫隔離級別的一致,你一定要記得將 MySQL 的隔離級別設置為“讀提交”。

配置的方式是,將啟動參數transaction-isolation的值設置成READ-COMMITTED。

你可以用show variables來查看當前的事務隔離級別。

mysql> show variables like '%tx_isolation%';

+-----------------------+----------------+

| Variable_name | Value |

+-----------------------+----------------+

| tx_isolation | REPEATABLE-READ |

+-----------------------+----------------+

通過如下方式,可以將其進行重新設置,比如設置為“讀提交”

mysql> set tx_isolatinotallow='READ-COMMITTED';

總結來說,每種隔離級別都有自己的使用場景,你要根據自己的業務情況來定!

可能有的同學會發出疑問,“讀提交”就可以解決問題,為什么還要搞個“可重復讀”隔離機制呢?

下面我們以數據校對的邏輯為案例,來介紹一下“可重復讀”的隔離好處!

假設你在管理一個個人銀行賬戶表,一個表存了賬戶余額,一個表存了賬單明細,到了月底你要做數據校對,也就是判斷上個月的余額和當前余額的差額,是否與本月的賬單明細一致。你一定希望在數據校對過程中,即使有用戶發生了一筆新的交易,也不影響你的校對結果。

這時候使用“可重復讀”的隔離級別就極其實用而又方便,因為事務啟動時的視圖可以認為是靜態的,不受其他事務更新的影響。

三、如何理解臟讀、不可重復讀、幻讀?

在上面我們介紹了隔離機制,當出現多個事務同時處理一條數據的時候,就會產生一些問題,具體來說就是:臟讀、不可重復讀和幻讀。

3.1、臟讀

臟讀指的是讀到了其他事務未提交的數據,未提交意味著這些數據可能會保存到數據庫,也可能會回滾,不保存到數據庫。當這個數據發生了回滾,就意味著這個數據不存在,這就是臟讀!

以上面的案例為例,當隔離級別為“讀未提交”時,V1 的值就是 2,假如事務 B 最后沒有提交數據,相當于讀取了一條不存在的數據,這就會產生臟讀,一旦產生臟讀會很嚴重,會整個業務影響很大。

3.2、不可重復讀

不可重復讀指的是在一個事務內,最開始讀到的數據和事務結束前的任意時刻讀到的同一批數據出現不一致的情況。

以上面的案例為例,當隔離級別為“讀提交”時,就會產生同一個事務,多次讀取同一條數據會產生不同的結果。

3.3、幻讀

幻讀和不可重復讀,有點類似,同一個事務多次讀同一條數據結果不一致,但是表達的側重點不一樣。

比如,當事務 A  在查詢某條記錄是否存在,如果不存在就插入,在準備插入時,突然事務 B 也提交一條插入語句,而且提交速度快于事務 A,這個時候事務 A 在插入數據的時候,突然報錯,插入不了,此時就發生了幻讀!

不可重復讀側重表達:讀-讀,幻讀則側重表達:讀-寫,用寫來證實讀的是鬼影。

圖片圖片

上述所說的"臟讀","不可重復讀","幻讀"這些問題,其實本質都是因為并發操作造成的從數據庫讀數據不一致的問題。

首先說讀未提交,它是性能最好,也可以說它是最野蠻的方式,因為它壓根兒就不加鎖,所以根本談不上什么隔離效果,可以理解為沒有隔離。

再來說串行化,串行化就相當于上面所說的,處理一個人請求的時候,別的人都等著。并發效率最差。

最后說讀提交和可重復讀。這兩種隔離級別都是比較復雜的,既要允許一定的并發,又想要兼顧解決問題。

數據庫的事務隔離越嚴格,并發副作用越小,但付出的代價越大;因為事務隔離本質就是使事務在一定程度上處于串行狀態,這本身就是和并發相矛盾的。

不同的應用對讀一致性和事務隔離級別是不一樣的,比如許多應用對數據的一致性沒那么高要求,相反,對并發有一定要求,具體的隔離機制的設置還需要從實際的業務需求和系統情況出發。

對于幻讀這種問題,可以在數據插入或者更新的時候,通過增加樂觀鎖來解決數據寫入失敗問題。

四、事務隔離的實現

理解了事務的隔離級別,我們再來看看事務隔離具體是怎么實現的。這里我們展開說明“可重復讀”。

在 MySQL 中,實際上每條記錄在更新的時候,都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前一個狀態的值。

假設一個值從 1 被按順序改成了 2、3、4,在回滾日志里面就會有類似下面的記錄。

圖片圖片

當前值是 4,但是在查詢這條記錄的時候,不同時刻啟動的事務會有不同的 read-view。

如圖中看到的,在視圖 A、B、C 里面,這一個記錄的值分別是 1、2、4,同一條記錄在系統中可以存在多個版本,就是數據庫的多版本并發控制(MVCC)。對于 read-view A,要得到 1,就必須將當前值依次執行圖中所有的回滾操作得到。

同時你會發現,即使現在有另外一個事務正在將 4 改成 5,這個事務跟 read-view A、B、C 對應的事務是不會沖突的。

你一定會問,回滾日志總不能一直保留吧,什么時候刪除呢?

答案是,在不需要的時候才刪除。也就是說,系統會判斷,當沒有事務再需要用到這些回滾日志時,回滾日志會被刪除。

什么時候才不需要了呢?就是當系統里沒有比這個回滾日志更早的 read-view 的時候。

基于上面的說明,我們來討論一下為什么建議盡量不要使用長事務。

長事務意味著系統里面會存在很老的事務視圖。

由于這些事務隨時可能訪問數據庫里面的任何數據,所以這個事務提交之前,數據庫里面它可能用到的回滾記錄都必須保留,這就會導致大量占用存儲空間。

在 MySQL 5.5 及以前的版本,回滾日志是跟數據字典一起放在 ibdata 文件里的,即使長事務最終提交,回滾段被清理,文件也不會變小。我見過數據只有 20GB,而回滾段有 200GB 的庫。最終只好為了清理回滾段,重建整個庫。

除了對回滾段的影響,長事務還占用鎖資源,也可能拖垮整個庫。

五、小結

本篇主要介紹了事務隔離相關理論知識,以及圍繞 MySQL 的事務隔離實現介紹,如果有描述不對的地方,歡迎指正!

六、參考

1、https://blog.csdn.net/weixin_38019299/article/details/121266965

2、https://baijiahao.baidu.com/s?id=1717095300761675602&wfr=spider&for=pc

責任編輯:武曉燕 來源: 潘志的技術筆記
相關推薦

2016-03-03 17:42:10

DockerDCOS

2024-05-31 08:00:00

2020-02-18 16:53:48

機械硬盤SMRPMR

2018-08-08 15:24:25

NVME M.2固態硬盤

2023-10-11 08:09:53

事務隔離級別

2023-12-01 08:39:29

分布式鎖系統

2019-08-01 11:04:10

Linux磁盤I

2020-03-05 09:33:15

數據庫事務隔離事務

2021-03-04 10:20:41

運維工程師互聯網

2018-03-05 11:29:17

云計算云服務服務器

2017-07-04 08:36:37

云服務器ECS計算服務

2020-04-21 23:14:08

數據并發控制

2018-07-17 10:58:45

數據庫數據庫事務隔離級別

2023-11-01 07:01:07

自動化測試自動測試工具

2021-11-30 05:45:16

固態硬盤總線接口

2019-07-10 15:15:23

JVM虛擬機Java

2018-07-05 14:05:28

電腦視頻接口

2018-06-26 16:31:45

2020-02-08 20:17:55

負載均衡高可用互聯網
點贊
收藏

51CTO技術棧公眾號

亚洲人成伊人成综合网久久久| 欧美亚洲国产精品久久| 国产特级淫片免费看| 日本视频精品一区| 在线视频欧美日韩精品| 欧美α欧美αv大片| 欧美性猛交xxxx黑人交| 欧美丰满一区二区免费视频| 98精品视频| 中文字幕免费在线视频| 99电影网电视剧在线观看| 久久久精品一区二区三区| 亚洲日本欧美日韩高观看| 日韩精品久久久久久福利| 欧美日韩国产欧美日美国产精品| 都市激情亚洲色图| 激情都市一区二区| 精品无码三级在线观看视频| 免费人成网站在线观看欧美高清| 亚洲91精品| 在线欧美亚洲| 久久午夜精品一区二区| 亚洲免费二区| 最新国产精品| 91精品国产乱码久久久竹菊| 警花av一区二区三区| 久草在线综合| 国产福利亚洲| 成人毛片av在线| 中文字幕亚洲精品视频| 欧美日本视频在线观看| 国产精品亚洲a| 永久www成人看片| 四虎av网址| 日本视频二区| 日本一卡二卡四卡精品| 午夜精品剧场| 亚洲黑丝一区二区| 中文字幕一区图| 精品产国自在拍| 久久久久97| 另类在线视频| 久久av资源| 亚洲成人精选| 欧美日韩国产影片| 精品性高朝久久久久久久| 国产91色在线|免| 欧美二区在线| 日韩中文字幕在线视频观看| 精华区一区二区三区| 蜜桃av在线| 91香蕉在线观看| 丰满少妇一区| 亚洲精品成a人ⅴ香蕉片| 日本久久一二三四| 成人av综合网| 国产欧美三级| 国产精品国产三级国产专播品爱网| 日本精品视频一区二区| 久久天堂电影网| 精品国产乱码久久久久久蜜柚| a级黄色小视频| 国产视频第一页在线观看| 精品成人免费一区二区在线播放| 欧美老女人另类| 99精品欧美一区二区三区综合在线| 亚洲精品视频免费看| 亚洲人成电影在线| 国产综合欧美在线看| 国产小视频精品| av免费在线一区| 成人毛片在线| 久久久91精品国产一区二区三区| 黑人欧美xxxx| 午夜精品免费视频| 欧美视频在线观看网站| 97超碰国产一区二区三区| 国产日韩视频在线| 91天堂素人约啪| 国产亚洲a∨片在线观看| 国产精品专区第二| 激情丁香婷婷| 色呦呦在线播放| 久久久久久久久丰满| 国产精品区一区二区三区| 色婷婷综合久久久久中文一区二区| 97在线视频免费| 毛片在线视频观看| 国产精品vvv| 韩国视频一区二区| 欧美一区二区三区色| 精品一区二区视频| 国产高清视频在线| 国产九一精品| 国产精品高清亚洲| 久久婷婷丁香| 一区二区三区四区在线免费观看| 91在线视频九色| 亚洲精品wwwww| 日韩av高清不卡| av电影一区二区三区| 久久久久狠狠高潮亚洲精品| 诱人的瑜伽老师3hd中字| 超清福利视频| 免费在线中文字幕| 高清一区二区三区av| 欧美h版在线观看| 麻豆精品蜜桃| 成人做爰69片免费看网站| 国产视频精品一区二区三区| 亚洲高清资源综合久久精品| 欧美在线极品| 激情图区综合网| 久热国产精品视频| 福利网址在线| 销魂美女一区二区三区视频在线| **欧美大码日韩| 动漫精品视频| 超碰免费在线播放| 老司机免费视频一区二区 | 亚洲综合一区二区| 精品999在线观看| 亚洲色图美国十次| 国产女主播一区| 91在线观看免费观看| 在线网址91| 国产精品嫩草久久久久| 成人黄色午夜影院| 人人视频精品| 色系网站成人免费| 在线综合视频网站| 成午夜精品一区二区三区软件| 欧美网站大全在线观看| 免费av网址在线| 欧美视频福利| 色综合天天狠天天透天天伊人| 国产三级视频在线| 国产免费观看久久| 一区国产精品| 亚洲第一福利社区| 亚洲黄色片网站| 一起操在线观看| 亚洲欧美日韩视频二区| 国产成人精品最新| 三级欧美日韩| 日韩激情av在线免费观看| 欧美日韩一道本| 久久国产精品72免费观看| 亚洲精品日韩av| 精品一区三区| 激情五月婷婷综合网| 青青草一区二区| 日韩成人视屏| 精品国产乱码久久久久久图片 | 日本大臀精品| 国产精品国产自产拍高清av| www.国产亚洲| 日本特黄久久久高潮| 国产日韩一区欧美| 91综合久久爱com| 亚洲精品五月天| 精品无码久久久久国产| 免费人成黄页在线观看忧物| 欧美在线国产| 日本不卡免费高清视频| av在线免费网站| 欧美日韩中文在线| 色就是色亚洲色图| 91香蕉视频mp4| 可以免费观看av毛片| 蜜乳av另类精品一区二区| 国产九色91| 日本三级亚洲精品| 日韩av免费在线观看| 欧美高清免费| 久久久久日韩精品久久久男男| 看女生喷水的网站在线观看| 欧美一区二区三区在线视频| 日日干夜夜操s8| 亚洲一本大道在线| h网站在线免费观看| 日韩精品一区在线观看| 日韩av一卡| 久久久国产91| 亚洲91网站| 99久久精品费精品国产一区二区 | 欧美xingq一区二区| 91蝌蚪视频在线观看| 麻豆精品91| 91在线播放国产| 久久这里只有精品一区二区| 884aa四虎影成人精品一区| 冲田杏梨av在线| 国产91综合一区在线观看| 国产精品久久久对白| 欧美日韩在线二区| 45www国产精品网站| 精品国产亚洲一区二区三区| 日韩欧美亚洲另类制服综合在线| 污污片在线免费视频|