當前位置:首頁 » 操作系統 » 資料庫隔離級別

資料庫隔離級別

發布時間: 2022-12-14 23:46:08

① mysql默認事務隔離級別

SQL標准中支持4種事務隔離級別,READ_UNCOMMITTED(讀未提交),READ_COMMITTED(讀已提交),REPEATABLE_READ(可重復讀),SERIALIZABLE(串列讀),MySQL innodb引擎支持全部這4種事務隔離級別。

工具/原料:

聯想Y7000P

Windows10

MySQL6.0

1、啟動命令行窗口,連接MySQL資料庫

圖示,通過MySQL提供的客戶端命令mysql連接MySQL資料庫。

② MySQL的默認事務隔離級別是

mysql的4種事務隔離級別,如下所示:

1、未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會話中未提交事務修改的數據。

2、提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數資料庫默認都是該級別 (不重復讀)。

3、可重復讀(Repeated Read):可重復讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標准中,該隔離級別消除了不可重復讀,但是還存在幻象讀,但是innoDB解決了幻讀。

4、串列讀(Serializable):完全串列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。

相關簡介

MySQL是一個關系型資料庫管理系統,由瑞典MySQL AB公司開發,屬於Oracle旗下產品。MySQL 是最流行的關系型資料庫管理系統之一,在WEB應用方面,MySQL是最好的RDBMS(Relational Database Management System,關系資料庫管理系統) 應用軟體之一。

MySQL是一種關系型資料庫管理系統,關系資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標准化語言。MySQL 軟體採用了雙授權政策,分為社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。

③ 資料庫事務隔離級別 一般用哪個

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


隔離級別的產生

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

所以隔離級別的作用是用來平衡資料庫並發訪問與數據一致性的方法。


事務的4種隔離級別

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

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


數據范圍全集組成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    如下:

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

  • 在了解了數據全集的組成後,我們再來看看事務並發時,會帶來的問題。

    無控制的並發所帶來的問題

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

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

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

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

  • 臟讀: 一個事務正在對一條記錄做修改,這個事務完成並提交前,這條記錄就處於不一致狀態。

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

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

    這種現象就叫「臟讀」。

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

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

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

    這種現象就叫「不可重復讀」。

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

    卻發現其他事務插入了滿足其查詢條件的新數據,這種現象稱為「幻讀」。

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

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

    MySQL 隔離級別的實現

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

    行鎖包含:

  • Record Locks

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

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

  • Gap Locks

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

    間隙鎖是性能和並發之間權衡的一部分。

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

  • 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 執行 "semi-consistent" 讀取,這樣它會將最新提交的版本返回到 MySQL,

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

    總結&延展:

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

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

    行鎖的增加是一行一行增加的,所以可能導致並發情況下死鎖的發生。

    例如,

    在 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 開始則加鎖,事務結束才釋放鎖。

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

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

    鎖只是並發控制的一種粒度,只是一個很小的部分:

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

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

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

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

④ 事務隔離級別有哪些

事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。事物的並發操作中可能休閑臟讀,不可重復讀,幻讀。

1、第一種隔離級別:Read uncommitted(讀未提交)

如果一個事務已經開始寫數據,則另外一個事務不允許同時進行寫操作,但允許其他事務讀此行數據,該隔離級別可以通過「排他寫鎖」,但是不排斥讀線程實現。這樣就避免了更新丟失,卻可能出現臟讀,也就是說事務B讀取到了事務A未提交的數據。

解決了更新丟失,但還是可能會出現臟讀。

2、第二種隔離級別:Read committed(讀提交)

如果是一個讀事務(線程),則允許其他事務讀寫,如果是寫事務將會禁止其他事務訪問該行數據,該隔離級別避免了臟讀,但是可能出現不可重復讀。事務A事先讀取了數據,事務B緊接著更新了數據,並提交了事務,而事務A再次讀取該數據時,數據已經發生了改變。

解決了更新丟失和臟讀問題。

3、第三種隔離級別:Repeatable read(可重復讀取)

可重復讀取是指在一個事務內,多次讀同一個數據,在這個事務還沒結束時,其他事務不能訪問該數據,這樣就可以在同一個事務內兩次讀到的數據是一樣的,因此稱為是可重復讀隔離級別,讀取數據的事務將會禁止寫事務,寫事務則禁止任何其他事務,這樣避免了不可重復讀和臟讀,但是有時可能會出現幻讀。

讀取數據的事務可以通過「共享讀鏡」和「排他寫鎖」實現。

解決了更新丟失、臟讀、不可重復讀、但是還會出現幻讀。

4、第四種隔離級別:Serializable(可序化)

提供嚴格的事務隔離,它要求事務序列化執行,事務只能一個接著一個地執行,但不能並發執行,如果僅僅通過「行級鎖」是無法實現序列化的,必須通過其他機制保證新插入的數據不會被執行查詢操作的事務訪問到。

序列化是最高的事務隔離級別,同時代價也是最高的,性能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免臟讀、不可重復讀,還避免了幻讀。

事務的基本要素(ACID)

1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

2、一致性(Consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

3、隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

4、持久性(Durability):事務完成後,事務對資料庫的所有更新將被保存到資料庫,不能回滾。

以上內容參考:事務隔離級別 - 網路

⑤ 資料庫事務隔離級別

一個事務可以讀取到另一個事務未提交的內容;(臟讀)

事務要等到另一個事務提交後才能讀取到該條內容;

在一個開啟事務讀取數據後,在未提交之前不再允許修改。(MySql默認級別)

序列化時最高的事務隔離級別,在該級別下,事務串列順序執行,可以避免臟讀、不可重復讀、幻讀。

⑥ 資料庫事務的四個隔離級別,mysql在哪一個級別

為了給程序配置資源隔離,通常我們會到 cgroup 層級樹下的控制器⾥,創建或者修改控制組⽂件。

修改方法

有兩種方法可以對配置了 systemd 的程序進行資源隔離:1. 命令行修改:通過執行systemctl set-property命令實現,形式為systemctl set-propertyname parameter=value;修改默認即時生效。2. 手工修改文件:直接編輯程序的 systemd unit file 文件,完成之後需手工執行systemctldaemon-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 等後綴表示值的大小。與 cgroupmemory 控制器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 語句根據條件掃描到的可能需要加鎖的數據范圍;

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

⑦ 事務隔離級別是什麼

事務隔離級別是為了保證並發讀取資料庫中數據正確性而採用的一種策略。

事務隔離級別包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的並發處理,並擁有更低的系統開銷。

事務的隔離級別有四種級別,讀取未提交內容,在該隔離級別,所有事務都可以看到其他未提交事務的執行結果、讀取提交內容,這是大多數資料庫系統的默認隔離級別。

可重讀,它確保同一事務的多個實例在並發讀取數據時,會看到同樣的數據行、可串列化,這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突。

事務隔離的解決方法:

1、未授權讀取的方法,也稱為讀未提交。該隔離級別可以通過「排他寫鎖」實現。

2、授權讀取的方法,可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。

3、可重復讀取,通過「共享讀鎖」和「排他寫鎖」實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

4、序列化的方式。它要求事務序列化執行,事務只能一個接著一個地執行,不能並發執行。

以上內容參考:網路-事務隔離級別

⑧ 事務的隔離級別是什麼

資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的並發操作中可能會出現臟讀,不可重復讀,幻讀。

1、Read uncommitted

讀未提交,顧名思義,就是一個事務可以讀取另一個未提交事務的數據。

2、Read committed

讀提交,顧名思義,就是一個事務要等另一個事務提交後才能讀取數據。

3、Repeatable read

重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作。

4、Serializable 序列化

Serializable 是最高的事務隔離級別,在該級別下,事務串列化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫性能,一般不使用。

熱點內容
編譯好的內核如何升級另一台主機 發布:2025-05-15 02:00:06 瀏覽:757
彈反腳本 發布:2025-05-15 01:58:24 瀏覽:585
安卓按鍵大師怎麼用 發布:2025-05-15 01:54:12 瀏覽:686
手機ea伺服器連不上怎麼辦 發布:2025-05-15 01:35:03 瀏覽:450
資料庫數據插入語句 發布:2025-05-15 01:30:01 瀏覽:871
js是無需編譯直接運行嗎 發布:2025-05-15 01:28:30 瀏覽:476
android文件夾重命名 發布:2025-05-15 01:13:50 瀏覽:481
cns腳本 發布:2025-05-15 01:13:38 瀏覽:722
數據結構與演算法筆試題 發布:2025-05-15 01:04:20 瀏覽:417
搜狗輸入法如何直接編輯配置文件 發布:2025-05-15 00:51:47 瀏覽:668