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

歡迎訪問 生活随笔!

生活随笔

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

数据库

五分钟了解数据库事务隔离

發布時間:2023/12/4 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五分钟了解数据库事务隔离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

什么是事務隔離呢?們知道,關系型數據基本都支持事務,事務具備四個特性,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),也就是傳說中的ACID,有了這四個特性,才能保證事務中所有數據的正確性。

其中事務的隔離性就是指多個并發的線程同時操作同一條記錄時,每個事務中的操作或數據不能被其他事務干擾。如果沒有隔離會怎么樣?會產生各種各樣的問題,比如修改丟失、臟讀、幻讀等。

下面我們一起看下事務隔離的演變,假設有兩個事務線程同時要操作A記錄。

1、修改丟失

事務1讀取A=100,加上20后等于120寫回數據庫,同時事務2讀取A=100,減去50后等于70寫回數據庫。這時事務1的操作就會被事務2覆蓋,如下圖:

為了解決修改被覆蓋的問題,數據庫給A加了寫鎖(排他鎖),這樣事務1在修改前先獲取A的排他鎖,等事務提交后再釋放鎖,如下圖:

2、臟讀

加了排他鎖后,修改丟失的問題得到了解決,雖然寫數據的問題通過鎖解決了,但讀卻沒有解決。比如在事務1在操作A的過程中,事務2讀取A,這時就會發生臟讀,如下圖:

為了解決臟讀的問題,得把讀數據也要加個讀鎖(共享鎖),并定了規則:如果加了排他鎖,就無法獲取共享鎖,反之,如果加了共享鎖,則無法獲取排他鎖,且共享鎖在讀取完就要釋放,如下圖:

3、不可重復讀

臟讀的問題通過共享鎖解決了,但共享鎖的規則是讀取完數據后立馬釋放共享鎖,這樣效率很高,但會引起一個問題,即在事務1中讀取A的值后必須立刻釋放鎖,正巧事務2這時修改了A的值,然后事務1再讀取A的值時發現和剛才讀的怎么不一樣了?如下圖:

為了保證同一個記錄在當前事務中的值保持一致(即可重復讀),則共享鎖也必須在事務結束后才能釋放,如下圖:

4、幻讀

可重復讀的問題解決了,現在遇到了一個更詭異的問題:事務1選擇賬號表中所有性別為女的行,并做了修改,修改完成后再查詢下記錄發現多了一條,原來是事務2在事務1修改的過程中又添加了一條性別為女的行,為了解決這樣問題(幻讀),只能將隔離級別再調高,每個事務按順序執行,即串行化。

5、小結

通過以上整合的演化,我們發現隔離級別越來越強,但并發效率卻越來越低,每一種隔離級別其實都是為解決特定的問題,做個小結如下:

  • 讀未提交(Read Uncommitted):寫數據時加了排他鎖,直到事務結束,讀數據時不加鎖,能避免修改丟失,但會讀到沒有提交或回滾的數據。

  • 讀提交(Read Committed):寫數據時加了排他鎖,直到事務結束,讀數據加上共享鎖,讀完立即釋放,能避免修改丟失、臟讀,但會出現不可重復讀的問題。

  • 可重復讀(Repeatable read):寫數據時加了排他鎖,直到事務結束,讀數據加上共享鎖,直到事務結束,能避免修改丟失、臟讀、不可重復讀,但會出現幻讀等問題。

  • 串行化(Serializable:事務排隊執行,雖然能解決以上所有問題,但效率太低了。

PS:一般沒有數據庫用串行化,性能比較低,常用的是已提交讀和可重復讀。而已提交讀和可重復讀的實現主要是ReadView,即MVCC(多版本控制),此內容單獨一篇文章講解,敬請關注。

總結

以上是生活随笔為你收集整理的五分钟了解数据库事务隔离的全部內容,希望文章能夠幫你解決所遇到的問題。

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