国产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中隔離級別RC與RR的區別_MySQL

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

MySQL中隔離級別RC與RR的區別_MySQL

MySQL中隔離級別RC與RR的區別_MySQL:1. 數據庫事務ACID特性 數據庫事務的4個特性: 原子性(Atomic): 事務中的多個操作,不可分割,要么都成功,要么都失敗; All or Nothing. 一致性(Consistency): 事務操作之后, 數據庫所處的狀態和業務規則是一致的; 比如a,b賬戶相互轉賬之后,總金
推薦度:
導讀MySQL中隔離級別RC與RR的區別_MySQL:1. 數據庫事務ACID特性 數據庫事務的4個特性: 原子性(Atomic): 事務中的多個操作,不可分割,要么都成功,要么都失敗; All or Nothing. 一致性(Consistency): 事務操作之后, 數據庫所處的狀態和業務規則是一致的; 比如a,b賬戶相互轉賬之后,總金

1. 數據庫事務ACID特性

數據庫事務的4個特性:

原子性(Atomic): 事務中的多個操作,不可分割,要么都成功,要么都失敗; All or Nothing.

一致性(Consistency): 事務操作之后, 數據庫所處的狀態和業務規則是一致的; 比如a,b賬戶相互轉賬之后,總金額不變;

隔離性(Isolation): 多個事務之間就像是串行執行一樣,不相互影響;

持久性(Durability): 事務提交后被持久化到永久存儲.

2. 隔離性

其中 隔離性 分為了四種:

READ UNCOMMITTED:可以讀取未提交的數據,未提交的數據稱為臟數據,所以又稱臟讀。此時:幻讀,不可重復讀和臟讀均允許;

READ COMMITTED:只能讀取已經提交的數據;此時:允許幻讀和不可重復讀,但不允許臟讀,所以RC隔離級別要求解決臟讀;

REPEATABLE READ:同一個事務中多次執行同一個select,讀取到的數據沒有發生改變;此時:允許幻讀,但不允許不可重復讀和臟讀,所以RR隔離級別要求解決不可重復讀;

SERIALIZABLE: 幻讀,不可重復讀和臟讀都不允許,所以serializable要求解決幻讀;

3. 幾個概念

臟讀:可以讀取未提交的數據。RC 要求解決臟讀;

不可重復讀:同一個事務中多次執行同一個select, 讀取到的數據發生了改變(被其它事務update并且提交);

可重復讀:同一個事務中多次執行同一個select, 讀取到的數據沒有發生改變(一般使用MVCC實現);RR各級級別要求達到可重復讀的標準;

幻讀:同一個事務中多次執行同一個select, 讀取到的數據行發生改變。也就是行數減少或者增加了(被其它事務delete/insert并且提交)。SERIALIZABLE要求解決幻讀問題;

這里一定要區分 不可重復讀 和 幻讀:

不可重復讀的重點是修改:

同樣的條件的select, 你讀取過的數據, 再次讀取出來發現值不一樣了

幻讀的重點在于新增或者刪除:

同樣的條件的select, 第1次和第2次讀出來的記錄數不一樣

從結果上來看, 兩者都是為多次讀取的結果不一致。但如果你從實現的角度來看, 它們的區別就比較大:

對于前者, 在RC下只需要鎖住滿足條件的記錄,就可以避免被其它事務修改,也就是 select for update, select in share mode; RR隔離下使用MVCC實現可重復讀;

對于后者, 要鎖住滿足條件的記錄及所有這些記錄之間的gap,也就是需要 gap lock。

而ANSI SQL標準沒有從隔離程度進行定義,而是定義了事務的隔離級別,同時定義了不同事務隔離級別解決的三大并發問題:

Isolation Level

Dirty Read

Unrepeatable Read

Phantom Read

Read UNCOMMITTED

YES

YES

YES

READ COMMITTED

NO

YES

YES

READ REPEATABLE

NO

NO

YES

SERIALIZABLE

NO

NO

NO

4. 數據庫的默認隔離級別

除了MySQL默認采用RR隔離級別之外,其它幾大數據庫都是采用RC隔離級別。

但是他們的實現也是極其不一樣的。Oracle僅僅實現了RC 和 SERIALIZABLE隔離級別。默認采用RC隔離級別,解決了臟讀。但是允許不可重復讀和幻讀。其SERIALIZABLE則解決了臟讀、不可重復讀、幻讀。

MySQL的實現:MySQL默認采用RR隔離級別,SQL標準是要求RR解決不可重復讀的問題,但是因為MySQL采用了gap lock,所以實際上MySQL的RR隔離級別也解決了幻讀的問題。那么MySQL的SERIALIZABLE是怎么回事呢?其實MySQL的SERIALIZABLE采用了經典的實現方式,對讀和寫都加鎖。

5. MySQL 中RC和RR隔離級別的區別

MySQL數據庫中默認隔離級別為RR,但是實際情況是使用RC 和 RR隔離級別的都不少。好像淘寶、網易都是使用的 RC 隔離級別。那么在MySQL中 RC 和 RR有什么區別呢?我們該如何選擇呢?為什么MySQL將RR作為默認的隔離級別呢?

5.1 RC 與 RR 在鎖方面的區別

1> 顯然 RR 支持 gap lock(next-key lock),而RC則沒有gap lock。因為MySQL的RR需要gap lock來解決幻讀問題。而RC隔離級別則是允許存在不可重復讀和幻讀的。所以RC的并發一般要好于RR;

2> RC 隔離級別,通過 where 條件過濾之后,不符合條件的記錄上的行鎖,會釋放掉(雖然這里破壞了“兩階段加鎖原則”);但是RR隔離級別,即使不符合where條件的記錄,也不會是否行鎖和gap lock;所以從鎖方面來看,RC的并發應該要好于RR;

5.2 RC 與 RR 在復制方面的區別

1> RC 隔離級別不支持 statement 格式的bin log,因為該格式的復制,會導致主從數據的不一致;只能使用 mixed 或者 row 格式的bin log; 這也是為什么MySQL默認使用RR隔離級別的原因。復制時,我們最好使用:binlog_format=row

2> MySQL5.6 的早期版本,RC隔離級別是可以設置成使用statement格式的bin log,后期版本則會直接報錯;

5.3 RC 與 RR 在一致性讀方面的區別

簡單而且,RC隔離級別時,事務中的每一條select語句會讀取到他自己執行時已經提交了的記錄,也就是每一條select都有自己的一致性讀ReadView; 而RR隔離級別時,事務中的一致性讀的ReadView是以第一條select語句的運行時,作為本事務的一致性讀snapshot的建立時間點的。只能讀取該時間點之前已經提交的數據。

具體可以參加:MySQL 一致性讀 深入研究

5.4 RC 支持半一致性讀,RR不支持

RC隔離級別下的update語句,使用的是半一致性讀(semi consistent);而RR隔離級別的update語句使用的是當前讀;當前讀會發生鎖的阻塞。

1> 半一致性讀:

A type of read operation used for UPDATE statements, that is a combination of read committed and consistent read. When an UPDATE statement examines a row that is already locked, InnoDB returns the latest committed version to MySQL so that MySQL can determine whether the row matches the WHERE condition of the UPDATE. If the row matches (must be updated), MySQL reads the row again, and this time InnoDB either locks it or waits for a lock on it. This type of read operation can only happen when the transaction has the read committed isolation level, or when the innodb_locks_unsafe_for_binlog option is enabled.

簡單來說,semi-consistent read是read committed與consistent read兩者的結合。一個update語句,如果讀到一行已經加鎖的記錄,此時InnoDB返回記錄最近提交的版本,由MySQL上層判斷此版本是否滿足 update的where條件。若滿足(需要更新),則MySQL會重新發起一次讀操作,此時會讀取行的最新版本(并加鎖)。semi-consistent read只會發生在read committed隔離級別下,或者是參數innodb_locks_unsafe_for_binlog被設置為true(該參數即將被廢棄)。

對比RR隔離級別,update語句會使用當前讀,如果一行被鎖定了,那么此時會被阻塞,發生鎖等待。而不會讀取最新的提交版本,然后來判斷是否符合where條件。

半一致性讀的優點:

減少了update語句時行鎖的沖突;對于不滿足update更新條件的記錄,可以提前放鎖,減少并發沖突的概率。

Oracle中的update好像有“重啟動”的概念。

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

文檔

MySQL中隔離級別RC與RR的區別_MySQL

MySQL中隔離級別RC與RR的區別_MySQL:1. 數據庫事務ACID特性 數據庫事務的4個特性: 原子性(Atomic): 事務中的多個操作,不可分割,要么都成功,要么都失敗; All or Nothing. 一致性(Consistency): 事務操作之后, 數據庫所處的狀態和業務規則是一致的; 比如a,b賬戶相互轉賬之后,總金
推薦度:
標簽: 級別 rr mysql
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产精品免费视频网站 | 国产免费高清视频在线观看不卡 | 亚洲va乱码一区二区三区 | 国产第一页在线视频 | 日韩 欧美 综合 | 亚洲最新视频在线观看 | 欧美亚洲精品在线 | 一级毛片私人影院免费 | 久久三级视频 | 国产精品免费_区二区三区观看 | 亚洲欧美日本在线 | 欧美激情综合亚洲一二区 | 国产精品亚洲一区二区三区久久 | 亚洲视频在线观看网站 | 综合久久综合 | 国产综合成人久久大片91 | 黄色毛片在线观看 | 欧美日韩视频在线播放 | 国产精品一区二区三区四区五区 | 欧美日韩高清不卡免费观看 | 欧美日韩ay在线观看 | 日本另类αv欧美另类aⅴ | 久久久久久综合一区中文字幕 | 99精品视频在线观看免费 | 国产视频分类 | 日韩视频免费在线观看 | 最近韩国日本免费观看 | 999国产精品999久久久久久 | 国产一区二区高清 | 欧美精品国产日韩综合在线 | 欧美国产日韩综合 | 日韩 亚洲 欧美 中文 高清 | 日韩 欧美 综合 | 免费一级 一片一毛片 | 日韩第二页 | 在线精品欧美日韩 | 精品国产网站 | 99视频九九精品视频在线观看 | 国产一在线| 伊人久久精品一区二区三区 | 欧美国产精品va在线观看 |