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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 事务值被改变_面试被问MySQL 事务的实现原理,怎么破?

發布時間:2025/4/5 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 事务值被改变_面试被问MySQL 事务的实现原理,怎么破? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java面試筆試面經、Java技術每天學習一點

作者:小小木的博客

來源:https://www.cnblogs.com/wyc1994666/

開篇

相信大家都用過事務以及了解他的特點,如原子性(Atomicity),一致性(Consistency),隔離型(Isolation)以及持久性(Durability)等。今天想跟大家一起研究下事務內部到底是怎么實現的,在講解前我想先拋出個問題:

事務想要做到什么效果?

按我理解,無非是要做到可靠性以及并發處理

可靠性:數據庫要保證當insert或update操作時拋異常或者數據庫crash的時候需要保障數據的操作前后的一致,想要做到這個,我需要知道我修改之前和修改之后的狀態,所以就有了undo log和redo log。

并發處理:也就是說當多個并發請求過來,并且其中有一個請求是對數據修改操作的時候會有影響,為了避免讀到臟數據,所以需要對事務之間的讀寫進行隔離,至于隔離到啥程度得看業務系統的場景了,實現這個就得用MySQL 的隔離級別。

下面我首先講實現事務功能的三個技術,分別是日志文件(redo log 和 undo log),鎖技術以及MVCC,然后再講事務的實現原理,包括原子性是怎么實現的,隔離型是怎么實現的等等。最后在做一個總結,希望大家能夠耐心看完

redo log與undo log介紹

mysql鎖技術以及MVCC基礎

事務的實現原理

總結

二、 redo log 與 undo log介紹

1. redo log

什么是redo log ?

redo log叫做重做日志,是用來實現事務的持久性。該日志文件由兩部分組成:重做日志緩沖(redo log buffer)以及重做日志文件(redo log),前者是在內存中,后者在磁盤中。當事務提交之后會把所有修改信息都會存到該日志中。假設有個表叫做tb1(id,username) 現在要插入數據(3,ceshi)

redo log 有什么作用?

mysql 為了提升性能不會把每次的修改都實時同步到磁盤,而是會先存到Boffer Pool(緩沖池)里頭,把這個當作緩存來用。然后使用后臺線程去做緩沖池和磁盤之間的同步。

那么問題來了,如果還沒來的同步的時候宕機或斷電了怎么辦?還沒來得及執行上面圖中紅色的操作。這樣會導致丟部分已提交事務的修改信息!

所以引入了redo log來記錄已成功提交事務的修改信息,并且會把redo log持久化到磁盤,系統重啟之后在讀取redo log恢復最新數據。

總結:redo log是用來恢復數據的 用于保障,已提交事務的持久化特性

2.undo log

什么是 undo log ?

undo log 叫做回滾日志,用于記錄數據被修改前的信息。他正好跟前面所說的重做日志所記錄的相反,重做日志記錄數據被修改后的信息。undo log主要記錄的是數據的邏輯變化,為了在發生錯誤時回滾之前的操作,需要將之前的操作都記錄下來,然后在發生錯誤時才可以回滾。

還用上面那兩張表

每次寫入數據或者修改數據之前都會把修改前的信息記錄到 undo log。

undo log 有什么作用?

undo log 記錄事務修改之前版本的數據信息,因此假如由于系統錯誤或者rollback操作而回滾的話可以根據undo log的信息來進行回滾到沒被修改前的狀態。

總結:undo log是用來回滾數據的用于保障 未提交事務的原子性

三、mysql鎖技術以及MVCC基礎

1. mysql鎖技術

當有多個請求來讀取表中的數據時可以不采取任何操作,但是多個請求里有讀請求,又有修改請求時必須有一種措施來進行并發控制。不然很有可能會造成不一致。

讀寫鎖

解決上述問題很簡單,只需用兩種鎖的組合來對讀寫請求進行控制即可,這兩種鎖被稱為:

共享鎖(shared lock),又叫做"讀鎖"

讀鎖是可以共享的,或者說多個讀請求可以共享一把鎖讀數據,不會造成阻塞。

排他鎖(exclusive lock),又叫做"寫鎖"

寫鎖會排斥其他所有獲取鎖的請求,一直阻塞,直到寫入完成釋放鎖。

總結:

通過讀寫鎖,可以做到讀讀可以并行,但是不能做到寫讀,寫寫并行

事務的隔離性就是根據讀寫鎖來實現的!!!這個后面再說。

2. MVCC基礎

MVCC (MultiVersion Concurrency Control) 叫做多版本并發控制。

InnoDB的 MVCC ,是通過在每行記錄的后面保存兩個隱藏的列來實現的。這兩個列,一個保存了行的創建時間,一個保存了行的過期時間,當然存儲的并不是實際的時間值,而是系統版本號。

以上片段摘自《高性能Mysql》這本書對MVCC的定義。他的主要實現思想是通過數據多版本來做到讀寫分離。從而實現不加鎖讀進而做到讀寫并行。

MVCC在mysql中的實現依賴的是undo log與read view

undo log :undo log 中記錄某行數據的多個版本的數據。

read view :用來判斷當前版本數據的可見性

四、事務的實現

前面講的重做日志,回滾日志以及鎖技術就是實現事務的基礎。

事務的原子性是通過 undo log 來實現的

事務的持久性性是通過 redo log 來實現的

事務的隔離性是通過 (讀寫鎖+MVCC)來實現的

而事務的終極大 boss一致性是通過原子性,持久性,隔離性來實現的!!!

原子性,持久性,隔離性折騰半天的目的也是為了保障數據的一致性!

總之,ACID只是個概念,事務最終目的是要保障數據的可靠性,一致性。

1.原子性的實現

什么是原子性:

一個事務必須被視為不可分割的最小工作單位,一個事務中的所有操作要么全部成功提交,要么全部失敗回滾,對于一個事務來說不可能只執行其中的部分操作,這就是事務的原子性。

上面這段話取自《高性能MySQL》這本書對原子性的定義,原子性可以概括為就是要實現要么全部失敗,要么全部成功。

以上概念相信大家伙兒都了解,那么數據庫是怎么實現的呢?就是通過回滾操作。

所謂回滾操作就是當發生錯誤異常或者顯式的執行rollback語句時需要把數據還原到原先的模樣,所以這時候就需要用到undo log來進行回滾,接下來看一下undo log在實現事務原子性時怎么發揮作用的

1.1 undo log 的生成

假設有兩個表 bank和finance,表中原始數據如圖所示,當進行插入,刪除以及更新操作時生成的undo log如下面圖所示:

從上圖可以了解到數據的變更都伴隨著回滾日志的產生:

(1) 產生了被修改前數據(zhangsan,1000) 的回滾日志

(2) 產生了被修改前數據(zhangsan,0) 的回滾日志

根據上面流程可以得出如下結論:

1.每條數據變更(insert/update/delete)操作都伴隨一條undo log的生成,并且回滾日志必須先于數據持久化到磁盤上

2.所謂的回滾就是根據回滾日志做逆向操作,比如delete的逆向操作為insert,insert的逆向操作為delete,update的逆向為update等。

思考:為什么先寫日志后寫數據庫?---稍后做解釋

1.2 根據undo log 進行回滾

為了做到同時成功或者失敗,當系統發生錯誤或者執行rollback操作時需要根據undo log 進行回滾

回滾操作就是要還原到原來的狀態,undo log記錄了數據被修改前的信息以及新增和被刪除的數據信息,根據undo log生成回滾語句,比如:

(1) 如果在回滾日志里有新增數據記錄,則生成刪除該條的語句

(2) 如果在回滾日志里有刪除數據記錄,則生成生成該條的語句

(3) 如果在回滾日志里有修改數據記錄,則生成修改到原先數據的語句

2.持久性的實現

事務一旦提交,其所作做的修改會永久保存到數據庫中,此時即使系統崩潰修改的數據也不會丟失。

先了解一下MySQL的數據存儲機制,MySQL的表數據是存放在磁盤上的,因此想要存取的時候都要經歷磁盤IO,然而即使是使用SSD磁盤IO也是非常消耗性能的。

為此,為了提升性能InnoDB提供了緩沖池(Buffer Pool),Buffer Pool中包含了磁盤數據頁的映射,可以當做緩存來使用:

讀數據:會首先從緩沖池中讀取,如果緩沖池中沒有,則從磁盤讀取在放入緩沖池;

寫數據:會首先寫入緩沖池,緩沖池中的數據會定期同步到磁盤中;

上面這種緩沖池的措施雖然在性能方面帶來了質的飛躍,但是它也帶來了新的問題,當MySQL系統宕機,斷電的時候可能會丟數據!!!

因為我們的數據已經提交了,但此時是在緩沖池里頭,還沒來得及在磁盤持久化,所以我們急需一種機制需要存一下已提交事務的數據,為恢復數據使用。

于是 redo log就派上用場了。下面看下redo log是什么時候產生的

既然redo log也需要存儲,也涉及磁盤IO為啥還用它?

(1)redo log 的存儲是順序存儲,而緩存同步是隨機操作。

(2)緩存同步是以數據頁為單位的,每次傳輸的數據大小大于redo log。

3.隔離性實現

隔離性是事務ACID特性里最復雜的一個。在SQL標準里定義了四種隔離級別,每一種級別都規定一個事務中的修改,哪些是事務之間可見的,哪些是不可見的。

級別越低的隔離級別可以執行越高的并發,但同時實現復雜度以及開銷也越大。

Mysql 隔離級別有以下四種(級別由低到高):

READ UNCOMMITED(未提交讀)

READ COMMITED(提交讀)

REPEATABLE READ(可重復讀)

SERIALIZABLE(可重復讀)

只要徹底理解了隔離級別以及他的實現原理就相當于理解了ACID里的隔離型。前面說過原子性,隔離性,持久性的目的都是為了要做到一致性,但隔離型跟其他兩個有所區別,原子性和持久性是為了要實現數據的可性保障靠,比如要做到宕機后的恢復,以及錯誤后的回滾。

那么隔離性是要做到什么呢?隔離性是要管理多個并發讀寫請求的訪問順序。這種順序包括串行或者是并行

說明一點,寫請求不僅僅是指insert操作,又包括update操作。

總之,從隔離性的實現可以看出這是一場數據的可靠性與性能之間的權衡。

可靠性性高的,并發性能低(比如 Serializable)

可靠性低的,并發性能高(比如 Read Uncommited)

READ UNCOMMITTED

在READ UNCOMMITTED隔離級別下,事務中的修改即使還沒提交,對其他事務是可見的。事務可以讀取未提交的數據,造成臟讀。

因為讀不會加任何鎖,所以寫操作在讀的過程中修改數據,所以會造成臟讀。好處是可以提升并發處理性能,能做到讀寫并行。

換句話說,讀的操作不能排斥寫請求。

優點:讀寫并行,性能高

缺點:造成臟讀

READ COMMITTED

一個事務的修改在他提交之前的所有修改,對其他事務都是不可見的。其他事務能讀到已提交的修改變化。在很多場景下這種邏輯是可以接受的。

InnoDB在 READ COMMITTED,使用排它鎖,讀取數據不加鎖而是使用了MVCC機制。或者換句話說他采用了讀寫分離機制。

但是該級別會產生不可重讀以及幻讀問題。

什么是不可重讀?

在一個事務內多次讀取的結果不一樣。

為什么會產生不可重復讀?

這跟 READ COMMITTED 級別下的MVCC機制有關系,在該隔離級別下每次 select的時候新生成一個版本號,所以每次select的時候讀的不是一個副本而是不同的副本。

在每次select之間有其他事務更新了我們讀取的數據并提交了,那就出現了不可重復讀

REPEATABLE READ(Mysql默認隔離級別)

在一個事務內的多次讀取的結果是一樣的。這種級別下可以避免,臟讀,不可重復讀等查詢問題。mysql 有兩種機制可以達到這種隔離級別的效果,分別是采用讀寫鎖以及MVCC。

采用讀寫鎖實現:

為什么能可重復度?只要沒釋放讀鎖,在次讀的時候還是可以讀到第一次讀的數據。

優點:實現起來簡單

缺點:無法做到讀寫并行

采用MVCC實現:

為什么能可重復度?因為多次讀取只生成一個版本,讀到的自然是相同數據。

優點:讀寫并行

缺點:實現的復雜度高

但是在該隔離級別下仍會存在幻讀的問題,關于幻讀的解決我打算另開一篇來介紹。

SERIALIZABLE

該隔離級別理解起來最簡單,實現也最單。在隔離級別下除了不會造成數據不一致問題,沒其他優點。

--摘自《高性能Mysql》

4.一致性的實現

數據庫總是從一個一致性的狀態轉移到另一個一致性的狀態.

下面舉個例子:zhangsan 從銀行卡轉400到理財賬戶

1.假如執行完 之發生異常了,銀行卡的錢也不能平白無辜的減少,而是回滾到最初狀態。

2.又或者事務提交之后,緩沖池還沒同步到磁盤的時候宕機了,這也是不能接受的,應該在重啟的時候恢復并持久化。

3.假如有并發事務請求的時候也應該做好事務之間的可見性問題,避免造成臟讀,不可重復讀,幻讀等。在涉及并發的情況下往往在性能和一致性之間做平衡,做一定的取舍,所以隔離性也是對一致性的一種破壞。

總結

本文出發點是想講一下Mysql的事務的實現原理。

實現事務采取了哪些技術以及思想?

原子性:使用 undo log ,從而達到回滾

持久性:使用 redo log,從而達到故障后恢復

隔離性:使用鎖以及MVCC,運用的優化思想有讀寫分離,讀讀并行,讀寫并行

一致性:通過回滾,以及恢復,和在并發環境下的隔離做到一致性。

總結

以上是生活随笔為你收集整理的mysql 事务值被改变_面试被问MySQL 事务的实现原理,怎么破?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女屁股眼视频免费 | 日韩av电影网 | 国产三级漂亮女教师 | 91麻豆精品久久久久蜜臀 | 性欧美激情 | 亚洲污片| 成年人免费网站视频 | 国产免费成人av | 一区二区免费在线观看 | 极品三级| 成人午夜电影网站 | 久久精品国产亚洲av麻豆蜜芽 | 秋霞三区 | 人人插人人澡 | 性淫影院| 竹菊影视日韩一区二区 | 日本一区二区高清免费 | 爆操欧美美女 | 欧美高清一区二区 | av资源网在线 | 在线色亚洲 | 污视频免费网站 | www.xxx.国产| 亚洲精品一区二区潘金莲 | 9i看片成人免费看片 | 91在线日本 | 色就是欧美| 欧美激情黑白配 | 超碰资源总站 | 大桥未久在线视频 | 欧美色资源| 中文字幕在线观看三区 | 亚洲少妇色 | www.成人网.com | 国产精品久久婷婷六月丁香 | 亚洲色偷偷色噜噜狠狠99网 | 玖玖玖视频 | 国产一区二区三区视频在线 | 国产黄色视 | 午夜色福利 | 最新日本中文字幕 | 国产精品一区二区三区免费视频 | 双性娇喘浑圆奶水h男男漫画 | 国产精品资源网 | 午夜播放| 一级黄色a毛片 | 97精品久久久 | 一级黄大片| 欧美成人精品在线观看 | 久久在线看 | 91最新入口 | 无码人妻精品一区二区三区温州 | 欧美亚洲日本 | 激情草逼 | 色哟哟视频在线 | 国产成人自拍视频在线 | 三级小视频在线观看 | 天堂综合网久久 | 亚洲一区二区三区影视 | 美女操出白浆 | 日韩三级观看 | 亚洲成人国产精品 | 精久久 | 97成人资源站 | 欧美xxxx18 | 精品国产乱码久久久久久婷婷 | 狠狠干超碰| 就去吻综合 | 综合久久久久久久久久久 | 午夜免费观看视频 | 免费一级特黄 | 色热热| 日美女逼逼 | 中文字幕中文在线 | 国产91精品久久久久久久 | 久久久精品一区二区 | 国产av电影一区二区三区 | 精品欧美黑人一区二区三区 | 久久久精品视频在线观看 | 国产深夜福利 | 直接看毛片| 国产色诱视频 | 欧美大浪妇猛交饥渴大叫 | 五月婷婷六月综合 | 与子敌伦刺激对白播放的优点 | 国产不卡视频在线播放 | 亚洲精品乱码久久久久99 | 操操操免费视频 | 欧美美女性视频 | 大奶骚 | 香蕉视频污在线观看 | 在线色站 | 亚洲第一第二区 | 爱爱免费小视频 | 欧美日一区二区 | 叼嘿视频在线免费观看 | 中文字幕韩日 | av大片在线免费观看 | 欧美日韩国产精品一区 |