HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    可重復讀和提交讀(可重復讀和讀已提交)

    發(fā)布時間:2023-04-13 22:44:10     稿源: 創(chuàng)意嶺    閱讀: 84        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于可重復讀和提交讀的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端

    官網:https://ai.de1919.com

    創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    可重復讀和提交讀(可重復讀和讀已提交)

    一、什么是可重復讀

    可重復讀(Repeatable Read),當使用可重復讀隔離級別時,在事務執(zhí)行期間會鎖定該事務以任何方式引用的所有行。

    二、mysql 隔離級別設置為什么比較好

    術式之后皆為邏輯,一切皆為需求和實現。希望此文能從需求、現狀和解決方式的角度幫大家理解隔離級別。

    隔離級別的產生

    在串型執(zhí)行的條件下,數據修改的順序是固定的、可預期的結果,但是并發(fā)執(zhí)行的情況下,數據的修改是不可預期的,也不固定,為了實現數據修改在并發(fā)執(zhí)行的情況下得到一個固定、可預期的結果,由此產生了隔離級別。

    所以隔離級別的作用是用來平衡數據庫并發(fā)訪問與數據一致性的方法。

    事務的4種隔離級別

    READ UNCOMMITTED       未提交讀,可以讀取未提交的數據。READ COMMITTED         已提交讀,對于鎖定讀(select with for update 或者 for share)、update 和 delete 語句,                       InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。                       Gap locking 僅用于外鍵約束檢查和重復鍵檢查。REPEATABLE READ        可重復讀,事務中的一致性讀取讀取的是事務第一次讀取所建立的快照。SERIALIZABLE           序列化

    在了解了 4 種隔離級別的需求后,在采用鎖控制隔離級別的基礎上,我們需要了解加鎖的對象(數據本身&間隙),以及了解整個數據范圍的全集組成。

    數據范圍全集組成

    SQL 語句根據條件判斷不需要掃描的數據范圍(不加鎖);

    SQL 語句根據條件掃描到的可能需要加鎖的數據范圍;

    以單個數據范圍為例,數據范圍全集包含:(數據范圍不一定是連續(xù)的值,也可能是間隔的值組成)

    1. 數據已經填充了整個數據范圍:(被完全填充的數據范圍,不存在數據間隙)

    • 整形,對值具有唯一約束條件的數據范圍 1~5 ,

      已有數據1、2、3、4、5,此時數據范圍已被完全填充;

    • 整形,對值具有唯一約束條件的數據范圍 1 和 5 ,

      已有數據1、5,此時數據范圍已被完全填充;

    • 2. 數據填充了部分數據范圍:(未被完全填充的數據范圍,是存在數據間隙)

    • 整形的數據范圍 1~5 ,

      已有數據 1、2、3、4、5,但是因為沒有唯一約束,

      所以數據范圍可以繼續(xù)被 1~5 的數據重復填充;

    • 整形,具有唯一約束條件的數據范圍 1~5 ,

      已有數據 2,5,此時數據范圍未被完全填充,還可以填充 1、3、4 ;

    • 3. 數據范圍內沒有任何數據(存在間隙)

      如下:

    • 整形的數據范圍 1~5 ,數據范圍內當前沒有任何數據。

    • 在了解了數據全集的組成后,我們再來看看事務并發(fā)時,會帶來的問題。

      無控制的并發(fā)所帶來的問題

      并發(fā)事務如果不加以控制的話會帶來一些問題,主要包括以下幾種情況。

      1. 范圍內已有數據更改導致的:

    • 更新丟失:當多個事務選擇了同一行,然后基于最初選定的值更新該行時,

      由于每個事物不知道其他事務的存在,最后的更新就會覆蓋其他事務所做的更新;

    • 臟讀: 一個事務正在對一條記錄做修改,這個事務完成并提交前,這條記錄就處于不一致狀態(tài)。

      這時,另外一個事務也來讀取同一條記錄,如果不加控制,

      第二個事務讀取了這些“臟”數據,并據此做了進一步的處理,就會產生提交的數據依賴關系。

      這種現象就叫“臟讀”。

    • 2. 范圍內數據量發(fā)生了變化導致:

    • 不可重復讀:一個事務在讀取某些數據后的某個時間,再次讀取以前讀過的數據,

      卻發(fā)現其讀出的數據已經發(fā)生了改變,或者某些記錄已經被刪除了。

      這種現象就叫“不可重復讀”。

    • 幻讀:一個事務按相同的查詢條件重新讀取以前檢索過的數據,

      卻發(fā)現其他事務插入了滿足其查詢條件的新數據,這種現象稱為“幻讀”。

      可以簡單的認為滿足條件的數據量變化了。

    • 因為無控制的并發(fā)會帶來一系列的問題,這些問題會導致無法滿足我們所需要的結果。因此我們需要控制并發(fā),以實現我們所期望的結果(隔離級別)。

      MySQL 隔離級別的實現

      InnoDB 通過加鎖的策略來支持這些隔離級別。

      行鎖包含:

    • Record Locks

      索引記錄鎖,索引記錄鎖始終鎖定索引記錄,即使表中未定義索引,

      這種情況下,InnoDB 創(chuàng)建一個隱藏的聚簇索引,并使用該索引進行記錄鎖定。

    • Gap Locks

      間隙鎖是索引記錄之間的間隙上的鎖,或者對第一條記錄之前或者最后一條記錄之后的鎖。

      間隙鎖是性能和并發(fā)之間權衡的一部分。

      對于無間隙的數據范圍不需要間隙鎖,因為沒有間隙。

    • Next-Key Locks

      索引記錄上的記錄鎖和索引記錄之前的 gap lock 的組合。

      假設索引包含 10、11、13 和 20。

      可能的next-key locks包括以下間隔,其中圓括號表示不包含間隔端點,方括號表示包含端點:

    • (負無窮大, 10]    (10, 11]    (11, 13]    (13, 20]    (20, 正無窮大)        對于最后一個間隔,next-key將會鎖定索引中最大值的上方,

    • 左右滑動進行查看

      "上確界"偽記錄的值高于索引中任何實際值。

      上確界不是一個真正的索引記錄,因此,實際上,這個 next-key 只鎖定最大索引值之后的間隙。

      基于此,當獲取的數據范圍中,數據已填充了所有的數據范圍,那么此時是不存在間隙的,也就不需要 gap lock。

      對于數據范圍內存在間隙的,需要根據隔離級別確認是否對間隙加鎖。

      默認的 REPEATABLE READ 隔離級別,為了保證可重復讀,除了對數據本身加鎖以外,還需要對數據間隙加鎖。

      READ COMMITTED 已提交讀,不匹配行的記錄鎖在 MySQL 評估了 where 條件后釋放。

      對于 update 語句,InnoDB 執(zhí)行 "semi-consistent" 讀取,這樣它會將最新提交的版本返回到 MySQL,

      以便 MySQL 可以確定該行是否與 update 的 where 條件相匹配。

      總結&延展:

      唯一索引存在唯一約束,所以變更后的數據若違反了唯一約束的原則,則會失敗。

      當 where 條件使用二級索引篩選數據時,會對二級索引命中的條目和對應的聚簇索引都加鎖;所以其他事務變更命中加鎖的聚簇索引時,都會等待鎖。

      行鎖的增加是一行一行增加的,所以可能導致并發(fā)情況下死鎖的發(fā)生。

      例如,

      在 session A 對符合條件的某聚簇索引加鎖時,可能 session B 已持有該聚簇索引的 Record Locks,而 session B 正在等待 session A 已持有的某聚簇索引的 Record Locks。

      session A 和 session B 是通過兩個不相干的二級索引定位到的聚簇索引。

      session A 通過索引 idA,session B通過索引 idB 。

      當 where 條件獲取的數據無間隙時,無論隔離級別為 rc 或 rr,都不會存在間隙鎖。

      比如通過唯一索引獲取到了已完全填充的數據范圍,此時不需要間隙鎖。

      間隙鎖的目的在于阻止數據插入間隙,所以無論是通過 insert 或 update 變更導致的間隙內數據的存在,都會被阻止。

      rc 隔離級別模式下,查詢和索引掃描將禁用 gap locking,此時 gap locking 僅用于外鍵約束檢查和重復鍵檢查(主要是唯一性檢查)。

      rr 模式下,為了防止幻讀,會加上 Gap Locks。

      事務中,SQL 開始則加鎖,事務結束才釋放鎖。

      就鎖類型而言,應該有優(yōu)化鎖,鎖升級等,例如rr模式未使用索引查詢的情況下,是否可以直接升級為表鎖。

      就鎖的應用場景而言,在回放場景中,如果確定事務可并發(fā),則可以考慮不加鎖,加快回放速度。

      鎖只是并發(fā)控制的一種粒度,只是一個很小的部分:

      從不同場景下是否需要控制并發(fā),(已知無交集且有序的數據的變更,MySQL 的 MTS 相同前置事務的多事務并發(fā)回放)

      并發(fā)控制的粒度,(鎖是一種邏輯粒度,可能還存在物理層和其他邏輯粒度或方式)

      相同粒度下的優(yōu)化,(鎖本身存在優(yōu)化,如IX、IS類型的優(yōu)化鎖)

      粒度加載的安全&性能(如獲取行鎖前,先獲取頁鎖,頁鎖在執(zhí)行獲取行鎖操作后即釋放,無論是否獲取成功)等多個層次去思考并發(fā)這玩意。

    三、數據庫事務隔離級別 一般用哪個

    READ

    COMMITTED(已提交讀)

    Oracle和sqlserver都是默認的隔離級別;

    REPEATABLE

    READ(可重復讀)

    Mysql的innodb默認的隔離級別,通過gap鎖已經實現了SERIALIZABLE(可序列化讀);

    READ

    UNCOMMITTED(未提交讀)

    幻想讀、不可重復讀和臟讀都允許。一個會話可以讀取其他事務未提交的更新結果,如果這個事務最后以回滾結束,這時的讀取結果就可能是不正確的,所以多數的數據庫都不會運用這種隔離級別。

    四、mysql默認隔離級別怎么加鎖

    修改方法

    有兩種方法可以對配置了 systemd 的程序進行資源隔離:1. 命令行修改:通過執(zhí)行 systemctl set-property 命令實現,形式為 systemctl set-property name parameter=value;修改默認即時生效。2. 手工修改文件:直接編輯程序的 systemd unit file 文件,完成之后需手工執(zhí)行 systemctl daemon-reload 更新配置,并重啟服務 systemctl restart name.service。

    systemd unit file 里支持的資源隔離配置項,如常見的:

    • CPUQuota=value

      該參數表示服務可以獲取的最大 CPU 時間,value 為百分數形式,高于 100% 表示可使用 1 核以上的 CPU。與 cgroup cpu 控制器 cpu.cfs_quota_us 配置項對應。

    • MemoryLimit=value

      該參數表示服務可以使用的最大內存量,value 可以使用 K, M, G, T 等后綴表示值的大小。與 cgroup memory 控制器 memory.limit_in_bytes 配置項對應。

    • 事務的4種隔離級別

      READ UNCOMMITTED       未提交讀,可以讀取未提交的數據。

      READ COMMITTED         已提交讀,對于鎖定讀(select with for update 或者 for share)、update 和 delete 語句,InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。                    

      Gap locking 僅用于外鍵約束檢查和重復鍵檢查。

      REPEATABLE READ        可重復讀,事務中的一致性讀取讀取的是事務第一次讀取所建立的快照。

      SERIALIZABLE           序列化在了解了 4 種隔離級別的需求后,在采用鎖控制隔離級別的基礎上,我們需要了解加鎖的對象(數據本身&間隙),以及了解整個數據范圍的全集組成。

      數據范圍全集組成

      SQL 語句根據條件判斷不需要掃描的數據范圍(不加鎖);

      SQL 語句根據條件掃描到的可能需要加鎖的數據范圍;

      以單個數據范圍為例,數據范圍全集包含:(數據范圍不一定是連續(xù)的值,也可能是間隔的值組成)

    以上就是關于可重復讀和提交讀相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    虛讀就是不可重復讀嗎(虛讀就是不可重復讀嗎)

    如何避免不可重復讀(如何避免不可重復讀英語)

    可重復讀會出現什么問題(可重復讀的意義)

    杭州水務集團年收入(杭州水務集團年收入多少錢)

    微信視頻號好友頭像是實時嗎