免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何實現MySQLInnoDB事務隔離級別?

今天介紹下,在 MySQL 的 InnoDB 存儲引擎中,事務隔離是如何實現的。

成都網站建設、做網站介紹好的網站是理念、設計和技術的結合。創新互聯擁有的網站設計理念、多方位的設計風格、經驗豐富的設計團隊。提供PC端+手機端網站建設,用營銷思維進行網站設計、采用先進技術開源代碼、注重用戶體驗與SEO基礎,將技術與創意整合到網站之中,以契合客戶的方式做到創意性的視覺化效果。

InnoDB 里面每個事務有一個唯一的事務 ID,叫作 transaction id。它是在事務開始的時候向 InnoDB 的事務系統申請的,是按申請順序嚴格遞增的。

對于數據庫的每行記錄,都會有三個隱藏字段:db_trx_id (事務 id)db_roll_pt (回滾指針)delete_flag(刪除標記)。— 有懂的朋友,還望別細糾,其實 delete_flag 是在頭信息中,這里是為了方便理解

對于 DML 操作來說:

  • INSERT:創建一條數據,db_trx_id 的值為當前事務 iddb_roll_pt 為 null 。
  • UPDATE:復制一行數據,將當前復制后這一行的 db_trx_id 置為當前事務的 iddb_roll_pt 是一個指針,指向復制前的那一條的。
  • DELETE:復制一行數據,將當前復制后這一行的 db_trx_id 置為當前事務的 iddb_roll_pt 是一個指針,指向復制前的那一條的。并把 delete_flag 置為 true 。

我們會用此語句建表及初始化數據,用于下面舉例:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `k` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

insert into t(id, k) values(1, 1);

數據初始狀態為:

如何實現MySQL InnoDB事務隔離級別?

Repeatable Read 可重復讀

如當前的隔離界別為 Repeatable Read ,下面是 SQL 的執行過程:

如何實現MySQL InnoDB事務隔離級別?

那么對于第 8,10,12,13 行來說,查詢的結果應該是什么呢?

結果應該分別是:2,1,3,1 。

下面我們來逐步回放,MySQL 底層是如何實現這整個過程的:

  • 第 1 行:表示每個事務的 ID 號,其中 read view 取的是所有當前活躍的事務 ID 數組,活躍指的是,已開啟并生成事務 ID 但未提交的事務。max id 取的是,目前為止,最大的事務 ID,不論是否已提交。我們還稱 read view 數組中,最小的值為 min id
  • 第 2 - 4 行:表示分別開啟使用,并創建此事務的 read view 及 max id,要注意的是,這里我并沒有使用 begin/start transaction 來開啟事務,是因為它們并不會馬上創建 read view 及 max id,而是在執行第一條 select 語句后,來進行創建的。
  • 第 5 行為修改 k 的值,自增 1,按照上面所說的規則,修改后:

如何實現MySQL InnoDB事務隔離級別?

  • 第 6 行,提交 ID 為 102 的事務。

  • 第 7 行執行了一個簡單查詢,未手動開啟事務,但也會自動開啟并生成 read view 及 max id,分別為 read-view: [100, 101] ,max-id: 103

此時會根據查詢規則,進行查找,規則如下:

  1. 如果數據的 db_trx_id < min id ,則說明數據在開啟當前事務前已提交的,內容可見。

  2. 如果數據的 db_trx_id > max id ,則說明數據在此事務啟動后生成的,內容不可見。

  3. 如果數據的 min id <= db_trx_id <= max id ,則還分為兩種情況:

    3.1 若 db_trx_id 在 read view 的數組中,表示這個版本是由還沒提交的事務生成的,不可見,但如果是自己的事務,則可見。

    3.2. 若不在數據中,則表示這個版本是已經提交了的事務生成的,可見。

示意圖如下:

如何實現MySQL InnoDB事務隔離級別?

當前的事務的一致性視圖為 read view: [100, 101] ,max id: 103,那么根據這個規則,在上面的數據鏈中查詢數據,從最新的藍色,開始找,找到第一個數據的 db_trx_id 為 102,符合規則 3.2 屬于可見范圍,查詢結果為 2。

  • 第 8 行,當前的事務的一致性視圖為 read view: [100, 101] ,max id: 101同樣根據規則,第一個數據的 db_trx_id 為 102,符合規則 2,不可見,那么根據指針 db_roll_pt 繼續查找,找到 db_trx_id 為 10 的數據,符合規則 1,數據可見,查詢結果為 1。
  • 第 9 行,修改 k 的值,自增 1,按照上面所說的規則,修改后:

如何實現MySQL InnoDB事務隔離級別?

  • 第 10 行,當前的事務的一致性視圖為 read view: [100] ,max id: 100 同樣根據規則,第一個數據的 db_trx_id 為 100,符合規則 3.1,在 read view 數組中,但是此 id 為當前事務 id,所以可是可見的,查詢結果為 3。

  • 第 11 行,當前的事務的一致性視圖為 read view: [100, 101] ,max id: 101 同樣根據規則,第一個數據的 db_trx_id 為 100,符合規則 3.1,在 read view 中,但是此 id 不為當前事務 id,所以內容可見的,那么根據指針 db_roll_pt 繼續查找,找到 db_trx_id 為 102 的數據,符合規則 2,不可見,繼續根據指針 db_roll_pt 查找,找到 db_trx_id 為 10 的數據,符合規則 1,數據可見,查詢結果為 1。
  • 第 12 - 13 行,為提交事務語句。

Read Committed 讀已提交

處于 Read Committed 讀已提交 也可套用上面的規則,不過一致性視圖: read view 和 max id 的創建時機,是每一條 select 語句時重新生成。你根據上面的內容,可以自己動手試驗下讀已提交。

網站標題:如何實現MySQLInnoDB事務隔離級別?
轉載來于:http://m.newbst.com/article26/jococg.html

成都網站建設公司_創新互聯,為您提供網站導航網站改版關鍵詞優化全網營銷推廣網頁設計公司電子商務

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站建設