mysql分布式數據庫架構,mysql 事務 返回插入的值_深入理解mysql事務:事務機制的實現原理

 2023-10-08 阅读 26 评论 0

摘要:作者:loganmysql分布式數據庫架構。出自:SegmentFault 思否一.事物的四個特性(ACID)原子性(Atomicity):操作這些指令時,要么全部執行成功,要么全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾

作者:logan

mysql分布式數據庫架構。出自:SegmentFault 思否

一.事物的四個特性(ACID)

原子性(Atomicity):操作這些指令時,要么全部執行成功,要么全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。eg:拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是20000,那么不管A和B之間如何轉賬,轉幾次賬,事務結束后兩個用戶的錢相加起來應該還得是20000,這就是事務的一致性。

● 一致性(Consistency):事務的執行使數據從一個狀態轉換為另一個狀態,但是對于整個數據的完整性保持穩定。

● 隔離性(Isolation):隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。

即要達到這么一種效果:對于任意兩個并發的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在并發地執行。

● 持久性(Durability)**:當事務正確完成后,它對于數據的改變是永久性的。

二.事務的隔離性(Isolation)

隔離性引發的問題

1.臟讀 事務A讀取到了事務B未提交的數據

2.不可重復讀 事務A讀取到了事務B提交的數據

3.虛讀 事務A讀取到了事務B插入的數據

mysql中的數據庫事務的隔離級別

Read uncommitted(最低級別,任何情況都無法保證。)

老板要給程序員發工資,程序員的工資是3.6萬/月。但是發工資時老板不小心按錯了數字,按成3.9萬/月,該錢已經打到程序員的戶口,但是事務還沒有提交,就在這時,程序員去查看自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老板及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。Analyse:實際程序員這個月的工資還是3.6萬,但是程序員看到的是3.9萬。他看到的是老板還沒提交事務時的數據。這就是臟讀。

Read committed(可避免臟讀的發生。)程序員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(程序員事務開啟),收費系統事先檢測到他的卡里有3.6萬,就在這個時候!!程序員的妻子要把錢全部轉出充當家用,并提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了(第二次檢測金額當然要等待妻子轉出金額事務提交完)。程序員就會很郁悶,明明卡里是有錢的…Analyse:這就是讀提交,若有事務對數據進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務提交后才能讀取數據,可以解決臟讀問題。但在這個事例中,出現了一個事務范圍內兩個相同的查詢卻返回了不同數據,這就是不可重復讀。

Repeatable read(可避免臟讀、不可重復讀的發生。)

程序員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(事務開啟,不允許其他事務的UPDATE修改操作),收費系統事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。Analyse:重復讀可以解決不可重復讀問題。寫到這里,應該明白的一點就是,不可重復讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。

Serializable(可避免臟讀、不可重復讀、幻讀的發生。)

程序員某一天去消費,花了2千元,然后他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事務開啟),看到確實是花了2千元,就在這個時候,程序員花了1萬買了一部電腦,即新增INSERT了一條消費記錄,并提交。當妻子打印程序員的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。

特別申明:mysql中默認的隔離級別是Repeatable read可重復讀,但是內部通過間隙鎖機制巧妙的解決了幻讀的問題,這里就不一一展開了

三.補充知識

mysql默認情況下auto_commit屬性未true

當執行sql時,會隱式提交一個事務,并自動提交

1.更改auto_commit屬性未false

2.輸入以下命令手動提交一個事務

begin;

select * from student;

commit;

四.實現原理

1.Read uncommitted讀未提交

不需要MVCC

2.Read committed讀提交

多版本并發控制實現,即多版本鏈,也可以稱為redolog

3.Repeatable read可重復讀

多版本并發控制解決讀未提交、不可重復讀

讀鎖+寫鎖(包括間隙鎖)解決幻讀

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/129228.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息