国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

MySql的隔離級別和鎖的關系_MySQL

來源:懂視網 責編:小采 時間:2020-11-09 20:18:24
文檔

MySql的隔離級別和鎖的關系_MySQL

MySql的隔離級別和鎖的關系_MySQL:一、事務的4個基本特征 Atomic(原子性): 事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要 么全部成功,要么全部失敗。 Consistency(一致性): 只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初 狀態。 Isolation
推薦度:
導讀MySql的隔離級別和鎖的關系_MySQL:一、事務的4個基本特征 Atomic(原子性): 事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要 么全部成功,要么全部失敗。 Consistency(一致性): 只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初 狀態。 Isolation
一、事務的4個基本特征

Atomic(原子性):
事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要
么全部成功,要么全部失敗。

Consistency(一致性):
只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初
狀態。

Isolation(隔離性):
事務允許多個用戶對同一個數據進行并發訪問,而不破壞數據的正
確性和完整性。同時,并行事務的修改必須與其他并行事務的修改
相互獨立。

Durability(持久性):
事務結束后,事務處理的結果必須能夠得到固化。

二、數據庫隔離級別

數據庫事務的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決臟讀、不可重復讀、幻讀這幾類問題。MySql設置的隔離級別默認為Repeatable Read,可重復讀級別。隔離級別可以配置。

√: 可能出現×: 不會出現

臟讀 不可重復讀 幻讀
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

注意:我們討論隔離級別的場景,主要是在多個事務并發的情況下,因此,接下來的講解都圍繞事務并發。

Read uncommitted 讀未提交

READ UNCOMMITTED是限制性最弱的隔離級別,因為該級別忽略其他事務放置的鎖。使用READ UNCOMMITTED級別執行的事務,可以讀取尚未由其他事務提交的修改后的數據值,這些行為稱為“臟”讀。我們所說的臟讀,兩個并發的事務,“事務A:領導給singo發工資”、“事務B:singo查詢工資賬戶”,事務B讀取了事務A尚未提交的數據。比如,事務1修改一行,事務2在事務1提交之前讀取了這一行。如果事務1回滾,事務2就讀取了一行沒有提交的數據,這樣的數據我們認為是不存在的。

Read committed 讀提交
該級別通過指定語句不能讀取其他事務已修改但是尚未提交的數據值,禁止執行臟讀。在當前事務中的各個語句執行之間,其他事務仍可以修改、插入或刪除數據,從而產生無法重復的讀操作,或“影子”數據。比如,事務1讀取了一行,事務2修改或者刪除這一行并且提交。如果事務1想再一次讀取這一行,它將獲得修改后的數據或者發現這一樣已經被刪除,因此事務的第二次讀取結果與第一次讀取結果不同,因此也叫不可重復讀。

大多數數據庫的默認級別就是Read committed,比如Sql Server , Oracle。如何解決不可重復讀這一問題,請看下一個隔離級別。

Repeatable read 重復讀
REPEATABLE READ是比READ COMMITTED限制性更強的隔離級別。該級別包括READ COMMITTED,并且另外指定了在當前事務提交之前,其他任何事務均不可以修改或刪除當前事務已讀取的數據。并發性低于READ COMMITTED,因為已讀數據的共享鎖在整個事務期間持有,而不是在每個語句結束時釋放。這個隔離級別只是說,不能夠修改和刪除,但是并沒有強制不能插入新的滿足條件查詢的數據行。此可以得出結論:REPEATABLE READ隔離級別保證了在相同的查詢條件下,同一個事務中的兩個查詢,第二次讀取的內容肯定包換第一次讀到的內容。注:Mysql的默認隔離級別就是Repeatable read。

重復讀與幻讀

重復讀是為了保證在一個事務中,相同查詢條件下讀取的數據值不發生改變,但是不能保證下次同樣條件查詢,結果記錄數不會增加。

幻讀就是為了解決這個問題而存在的,他將這個查詢范圍都加鎖了,所以就不能再往這個范圍內插入數據,這就是SERIALIZABLE 隔離級別做的事情。

Serializable 序列化
SERIALIZABLE是限制性最強的隔離級別,因為該級別鎖定整個范圍的鍵,并一直持有鎖,直到事務完成。該級別包括REPEATABLE READ,并增加了在事務完成之前,其他事務不能向事務已讀取的范圍插入新行的限制。比如,事務1讀取了一系列滿足搜索條件的行。事務2在執行SQL statement產生一行或者多行滿足事務1搜索條件的行時會沖突,則事務2回滾。這時事務1再次讀取了一系列滿足相同搜索條件的行,第二次讀取的結果和第一次讀取的結果相同。

三、鎖

一次封鎖or兩段鎖?
因為有大量的并發訪問,為了預防死鎖,一般應用中推薦使用一次封鎖法,就是在方法的開始階段,已經預先知道會用到哪些數據,然后全部鎖住,在方法運行之后,再全部解鎖。這種方式可以有效的避免循環死鎖,但在數據庫中卻不適用,因為在事務開始階段,數據庫并不知道會用到哪些數據。
數據庫遵循的是兩段鎖協議,將事務分成兩個階段,加鎖階段和解鎖階段(所以叫兩段鎖)

加鎖階段:在該階段可以進行加鎖操作。在對任何數據進行讀操作之前要申請并獲得S鎖(共享鎖,其它事務可以繼續加共享鎖,但不能加排它鎖),在進行寫操作之前要申請并獲得X鎖(排它鎖,其它事務不能再獲得任何鎖)。加鎖不成功,則事務進入等待狀態,直到加鎖成功才繼續執行。
解鎖階段:當事務釋放了一個封鎖以后,事務進入解鎖階段,在該階段只能進行解鎖操作不能再進行加鎖操作。
事務 加鎖/解鎖處理
begin;
insert into test .....加insert對應的鎖
update test set...加update對應的鎖
delete from test ....加delete對應的鎖
commit;事務提交時,同時釋放insert、update、delete對應的鎖
這種方式雖然無法避免死鎖,但是兩段鎖協議可以保證事務的并發調度是串行化(串行化很重要,尤其是在數據恢復和備份的時候)的。

不可重復讀和幻讀的區別
很多人容易搞混不可重復讀和幻讀,確實這兩者有些相似。但不可重復讀重點在于update和delete,而幻讀的重點在于insert。

如果使用鎖機制來實現這兩種隔離級別,在可重復讀中,該sql第一次讀取到數據后,就將這些數據加鎖,其它事務無法修改這些數據,就可以實現可重復讀了。但這種方法卻無法鎖住insert的數據,所以當事務A先前讀取了數據,或者修改了全部數據,事務B還是可以insert數據提交,這時事務A就會發現莫名其妙多了一條之前沒有的數據,這就是幻讀,不能通過行鎖來避免。需要Serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這么做可以有效的避免幻讀、不可重復讀、臟讀等問題,但會極大的降低數據庫的并發能力。

所以說不可重復讀和幻讀最大的區別,就在于如何通過鎖機制來解決他們產生的問題。

上文說的,是使用悲觀鎖機制來處理這兩種問題,但是MySQL、ORACLE、PostgreSQL等成熟的數據庫,出于性能考慮,都是使用了以樂觀鎖為理論基礎的MVCC(多版本并發控制)來避免這兩種問題。

悲觀鎖和樂觀鎖
悲觀鎖
正如其名,它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處于鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。

在悲觀鎖的情況下,為了保證事務的隔離性,就需要一致性鎖定讀。讀取數據時給加鎖,其它事務無法修改這些數據。修改刪除數據時也要加鎖,其它事務無法讀取這些數據。

樂觀鎖
相對悲觀鎖而言,樂觀鎖機制采取了更加寬松的加鎖機制。悲觀鎖大多數情況下依靠數據庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是數據庫性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。

而樂觀鎖機制在一定程度上解決了這個問題。樂觀鎖,大多是基于數據版本( Version )記錄機制實現。何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個 “version” 字段來實現。讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。

要說明的是,MVCC的實現沒有固定的規范,每個數據庫都會有不同的實現方式,這里討論的是InnoDB的MVCC。

MVCC在MySQL的InnoDB中的實現
在InnoDB中,會在每行數據后添加兩個額外的隱藏的值來實現MVCC,這兩個值一個記錄這行數據何時被創建,另外一個記錄這行數據何時過期(或者被刪除)。 在實際操作中,存儲的并不是時間,而是事務的版本號,每開啟一個新事務,事務的版本號就會遞增。 在可重讀Repeatable reads事務隔離級別下:

SELECT時,讀取創建版本號<=當前事務版本號,刪除版本號為空或>當前事務版本號。

INSERT時,保存當前事務版本號為行的創建版本號

DELETE時,保存當前事務版本號為行的刪除版本號

UPDATE時,插入一條新紀錄,保存當前事務版本號為行創建版本號,同時保存當前事務版本號到原來刪除的行

通過MVCC,雖然每行記錄都需要額外的存儲空間,更多的行檢查工作以及一些額外的維護工作,但可以減少鎖的使用,大多數讀操作都不用加鎖,讀數據操作很簡單,性能很好,并且也能保證只會讀取到符合標準的行,也只鎖住必要行。

我們不管從數據庫方面的教課書中學到,還是從網絡上看到,大都是上文中事務的四種隔離級別這一模塊列出的意思,RR級別是可重復讀的,但無法解決幻讀,而只有在Serializable級別才能解決幻讀。于是我就加了一個事務C來展示效果。在事務C中添加了一條teacher_id=1的數據commit,RR級別中應該會有幻讀現象,事務A在查詢teacher_id=1的數據時會讀到事務C新加的數據。但是測試后發現,在MySQL中是不存在這種情況的,在事務C提交后,事務A還是不會讀到這條數據。可見在MySQL的RR級別中,是解決了幻讀的讀問題的。參見下圖

20151125164322895.png (1530×1093)


Serializable
這個級別很簡單,讀加共享鎖,寫加排他鎖,讀寫互斥。使用的悲觀鎖的理論,實現簡單,數據更加安全,但是并發能力非常差。如果你的業務并發的特別少或者沒有并發,同時又要求數據及時可靠的話,可以使用這種模式。

這里要吐槽一句,不要看到select就說不會加鎖了,在Serializable這個級別,還是會加鎖的!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

MySql的隔離級別和鎖的關系_MySQL

MySql的隔離級別和鎖的關系_MySQL:一、事務的4個基本特征 Atomic(原子性): 事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要 么全部成功,要么全部失敗。 Consistency(一致性): 只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初 狀態。 Isolation
推薦度:
標簽: 關系 級別 mysql
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲视频播放 | 国内久久 | 最新国产精品亚洲二区 | 哪里有毛片 | 欧美xxxxxbbbbb| 一级特黄女毛毛片 | 免费看特级淫片日本 | 国产视频在 | 91精品一区二区三区在线播放 | 91在线 一区 二区三区 | 精品一区二区三区四区 | 毛片一区 | 日韩欧美小视频 | 欧美午夜影院 | 欧洲亚洲欧美国产日本高清 | 欧美亚洲国产精品第一页 | 精品视频一区二区三区 | 欧美亚洲综合图区在线 | 亚洲欧美激情在线 | 久久成人精品 | 日韩欧美一区二区三区四区 | 中文字幕日韩一区二区三区不卡 | 免费中文字幕一级毛片 | 一本综合久久国产二区 | 国产最新在线视频 | 国产 欧美 在线 | 国产 日韩 在线 | 自拍偷自拍亚洲精品情侣 | 国产区一区 | 国产精品电影一区二区三区 | 久久一区二区三区四区 | 欧美日韩国产乱了伦 | 无遮挡免费看 | 香蕉在线观看 | 欧美 第一页 | 久久一区精品 | 日韩精品第1页 | 欧美午夜视频 | 国产免费一区二区三区免费视频 | 国产原创一区二区 | 天天曰夜夜操 |