亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > MySQL InnoDB如何保證事務特性示例詳解

MySQL InnoDB如何保證事務特性示例詳解

熱門標簽:銅陵防封電銷卡 悟空科技電話機器人 福建外呼系統定制化 真人語音電話機器人 騰訊地圖標注提升 400電話可以免費申請嗎 美國反騷擾電話機器人 怎么在地圖標注位置生成圖片 電銷卡外呼系統供應商

前言

如果有人問你“數據庫事務有哪些特性”?你可能會很快回答出原子性、一致性、隔離性、持久性即ACID特性。那么你知道InnoDB如何保證這些事務特性的嗎?如果知道的話這篇文章就可以直接跳過不看啦(#^.^#)

先說結論:

  • redo log重做日志用來保證事務的持久性
  • undo log回滾日志保證事務的原子性
  • undo log+redo log保證事務的一致性
  • 鎖(共享、排他)用來保證事務的隔離性

重做日志 redo log

重做日志 redo log 分為兩部分:一部分是內存中的重做日志緩沖(redo log buffer),是易丟失的;二部分是重做日志文件(redo log file),是持久的。InnoDB通過Force Log at Commit機制來實現持久性,當commit時,必須先將事務的所有日志寫到重做日志文件進行持久化,待commit操作完成才算完成。

InnoDB在下面情況下會將重做日志緩沖的內容寫入重做日志文件:

  • master thread 每一秒將重做日志緩沖刷新到重做日志文件;
  • 每個事務提交時
  • 當重做日志緩沖池剩余空間小于1/2時

為了確保每次日志都寫入重做日志文件,在每次將日志緩沖寫入重做日志文件后,InnoDB存儲引擎都需要調用一次fsync(刷盤)操作。但這也不是絕對的。用戶可以通過修改innodb_flush_log_at_trx_commoit參數來控制重做日志刷新到磁盤的策略,這個可以作為大量事務提交時的優化點。

  • 1參數默認值,表示事務提交時必須調用一次fsync操作。
  • 0表示事務提交時,重做日志緩存并不立即寫入重做日志文件,而是隨著Master Thread的間隔進行fsync操作。
  • 2表示事務提交時將重做日志寫入重做日志文件,但僅寫入文件系統的緩存中,不進行fsync操作。
    fsync的效率取決于磁盤的性能,因此磁盤的性能決定了事務提交的性能,也就是數據庫的性能。所以如果有人問你如何優化Mysql數據庫的時候別忘了有硬件這一條,讓他們提升硬盤配置,換SSD固態硬盤
    重做日志都是以512字節進行存儲的,稱之為重做日志塊,與磁盤扇區大小一致,這意味著重做日志的寫入可以保證原子性,不需要doublewrite技術。它有以下3個特性:
  • 重做日志是在InnoDB層產生的
  • 重做日志是物理格式日志,記錄的是對每個頁的修改
  • 重做日志在事務進行中不斷被寫入,而且是順序寫入

回滾日志 undo log

為了滿足事務的原子性,在操作任何數據之前,首先將數據備份到一個地方(這個存儲數據備份的地方稱為Undo Log),然后進行數據的修改。如果出現了錯誤或者用戶執行了 ROLLBACK語句,系統可以利用Undo Log中的備份將數據恢復到事務開始之前的狀態。

undo log實現多版本并發控制(MVCC)來輔助保證事務的隔離性。

回滾日志不同于重做日志,它是邏輯日志,對數據庫的修改都邏輯的取消了。當事務回滾時,它實際上做的是與先前相反的工作。對于每個INSERT,InnoDB存儲引擎都會完成一個DELETE;對于每個UPDATE,InnoDB存儲引擎都會執行一個相反的UPDATE。

事務提交后并不能馬上刪除undo log,這是因為可能還有其他事務需要通過undo log 來得到行記錄之前的版本。故事務提交時將undo log 放入一個鏈表中,是否可以刪除undo log 根據操作不同分以下2種情況:

  • Insert undo log: insert操作的記錄,只對事務本身可見,對其他事務不可見(這是事務隔離性的要求),故該undo log可以在事務提交后直接刪除。不需要進行 purge操作。
  • update undo log:記錄的是對 delete和 update操作產生的 undo log。該undo log可能需要提供MVCC機制,因此不能在事務提交時就進行刪除。提交時放入undo log鏈表,等待 purge線程進行最后的刪除。


事務的隔離性的實現原理就是鎖,因而隔離性也可以稱為并發控制、鎖等。事務的隔離性要求每個讀寫事務的對象對其他事務的操作對象能互相分離。再者,比如操作緩沖池中的LRU列表,刪除,添加、移動LRU列表中的元素,為了保證一致性那么就要鎖的介入。

鎖的類型

InnoDB主要有2種鎖:行級鎖,意向鎖

行級鎖:

  • 共享鎖(讀鎖 S),允許事務讀一行數據。事務拿到某一行記錄的共享S鎖,才可以讀取這一行,并阻止別的事務對其添加X鎖。共享鎖的目的是提高讀讀并發。
  • 排它鎖(寫鎖 X),允許事務刪除一行數據或者更新一行數據。事務拿到某一行記錄的排它X鎖,才可以修改或者刪除這一行。排他鎖的目的是為了保證數據的一致性。

行級鎖中,除了S和S兼容,其他都不兼容。

意向鎖:

  • 意向共享鎖(讀鎖 IS ),事務想要獲取一張表的幾行數據的共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。
  • 意向排他鎖(寫鎖 IX),事務想要獲取一張表中幾行數據的排它鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。

解釋一下意向鎖

The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.

意向鎖的主要用途是為了表達某個事務正在鎖定一行或者將要鎖定一行數據。e.g:事務A要對一行記錄r進行上X鎖,那么InnoDB會先申請表的IX鎖,再鎖定記錄r的X鎖。在事務A完成之前,事務B想要來個全表操作,此時直接在表級別的IX就告訴事務B需要等待而不需要在表上判斷每一行是否有鎖。意向排它鎖存在的價值在于節約InnoDB對于鎖的定位和處理性能。另外注意了,除了全表掃描以外意向鎖都不會阻塞。

鎖的算法

InnoDB有三種行鎖的算法:

  • Record Lock:單個行記錄上的鎖
  • Gap Lock:間隙鎖,鎖定一個范圍,而非記錄本身
  • Next-Key Lock:結合Gap Lock和Record Lock,鎖定一個范圍,并且鎖定記錄本身。主要解決的問題是REPEATABLE READ隔離級別下的幻讀??梢詤⒖嘉恼铝私馐聞崭綦x級別的相關知識點。

這里主要講一下Next-Key Lock,利用Next-key Lock鎖定的不是單個值而是一個范圍,他的目的就是為了阻止多個事務將記錄插入到同一范圍內從而導致幻讀。

注意了,如果走唯一索引,那么Next-Key Lock會降級為Record Lock,即僅鎖住索引本身,而不是范圍。也就是說Next-Key Lock前置條件為事務隔離級別為RR且查詢的索引走的非唯一索引、主鍵索引。

下面我們用個例子詳細說一下。

首先建立一張表:

CREATE TABLE T (id int ,f_id int,PRIMARY KEY (id), KEY(f_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into T SELECT 1,1;
insert into T SELECT 3,1;
insert into T SELECT 5,3;
insert into T SELECT 7,6;
insert into T SELECT 10,8;

事務A執行如下語句:

SELECT * FROM T WHERE f_id = 3 FOR UPDATE

這時SQL語句走非唯一索引,因此使用Next-Key Locking加鎖,并且有2個索引,其需要分別進行鎖定。

對于聚集索引,其僅對id等于5的索引加上Record Lock。而對于輔助索引,其加上Next-Key Lock,鎖定了范圍(1,3),特別需要注意的是,InnoDB存儲引擎還會對輔助索引下一個鍵值加上Gap Lock,即范圍(3.6)的鎖。

所以如果在新session中執行如下語句都會報錯[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

select * from T where id = 5 lock in share MODE -- 不能執行,因為事務A已經給id=5的值加上了X鎖,執行會被阻塞
INSERT INTO T SELECT 4,2 -- 不能執行,輔助索引的值為2,在(1,3)的范圍內,執行阻塞
INSERT INTO T SELECT 6,5 -- 不能執行,gap鎖會鎖?。?,6)的范圍,執行阻塞

此時想象一下,事務A鎖定了f_id =5 的記錄, 正常會有個gap lock,鎖?。?,6),那么如果沒有(5,6)的gap鎖,那么用戶可以插入索引 f_id 為5的記錄,這樣事務A再次查詢就會返回一個不同的記錄,也就導致了幻讀的產生。

同理,如果我們事務A執行的是select * from T where f_id = 10 FOR UPDATE,在表里查不到數據,但是基于Next-Key Lock會鎖?。?,+∞),我們執行INSERT INTO T SELECT 6,11是無法插入成功的,這就從根本上解決了幻讀問題。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Mysql InnoDB和MyISAM區別原理解析
  • 獲取 MySQL innodb B+tree 的高度的方法
  • MySQL MyISAM 與InnoDB 的區別
  • 簡述MySQL InnoDB存儲引擎
  • MySQL Innodb 存儲結構 和 存儲Null值 用法詳解
  • MySQL InnoDB row_id邊界溢出驗證的方法步驟
  • MySQL啟動報錯問題InnoDB:Unable to lock/ibdata1 error
  • MySQL InnoDB中的鎖機制深入講解
  • 詳解MySQL(InnoDB)是如何處理死鎖的
  • MySQL學習(七):Innodb存儲引擎索引的實現原理詳解
  • MySQL slow_log表無法修改成innodb引擎詳解
  • mysql innodb的重要組件匯總

標簽:云浮 武威 烏海 臨汾 聊城 白銀 湖南 湖北

巨人網絡通訊聲明:本文標題《MySQL InnoDB如何保證事務特性示例詳解》,本文關鍵詞  MySQL,InnoDB,如何,保證,事務,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL InnoDB如何保證事務特性示例詳解》相關的同類信息!
  • 本頁收集關于MySQL InnoDB如何保證事務特性示例詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美电影免费| 日韩在线观看免费完整版视频| 色综合久久天天综合绕观看| 亚洲精品影院一区二区| 国产国语对白一级毛片| 日韩在线观看免费| 免费国产在线观看不卡| 国产美女在线一区二区三区| 日韩字幕在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 韩国毛片 免费| 欧美日本免费| a级毛片免费全部播放| 天天做日日爱| 免费国产在线观看不卡| 国产高清在线精品一区二区 | 欧美另类videosbestsex| 天天做日日爱夜夜爽| 成人a级高清视频在线观看| 中文字幕一区二区三区 精品| 精品国产一区二区三区久久久蜜臀| 国产一级生活片| 精品久久久久久综合网| 国产精品1024永久免费视频 | 欧美另类videosbestsex高清| 一本伊大人香蕉高清在线观看| 国产91精品一区二区| 国产网站麻豆精品视频| 99色视频在线观看| 欧美激情一区二区三区在线| 精品国产一区二区三区久| 九九精品影院| 青青青草影院 | 欧美激情中文字幕一区二区| 99久久精品国产免费| 久久99这里只有精品国产| 国产网站在线| 欧美激情一区二区三区在线| 午夜精品国产自在现线拍| 亚洲天堂在线播放| 91麻豆精品国产高清在线| 成人a大片高清在线观看| 精品视频免费看| 免费国产一级特黄aa大片在线| 亚欧成人毛片一区二区三区四区| 欧美a级v片不卡在线观看| 深夜做爰性大片中文| 天天做日日爱夜夜爽| 麻豆网站在线免费观看| 欧美一级视频免费| 国产成人啪精品视频免费软件| 日本特黄特色aaa大片免费| 亚洲第一页乱| 99色视频在线观看| 国产a免费观看| 国产a免费观看| 国产一区免费在线观看| 欧美国产日韩精品| 国产一区二区精品| 999久久狠狠免费精品| 青青青草影院| 国产伦精品一区二区三区无广告| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产不卡福利| 久久精品成人一区二区三区| 欧美激情一区二区三区视频| 久草免费在线视频| 国产高清在线精品一区二区 | 国产韩国精品一区二区三区| 精品视频在线看| 美女免费毛片| 精品国产一区二区三区精东影业| 中文字幕一区二区三区 精品| 国产激情视频在线观看| 免费国产一级特黄aa大片在线| 欧美日本国产| 韩国三级视频网站| 超级乱淫黄漫画免费| 日本免费乱人伦在线观看 | 亚欧成人乱码一区二区| 久久99中文字幕久久| 四虎影视库| 天天做人人爱夜夜爽2020| 国产国语在线播放视频| 人人干人人草| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 免费一级片在线| 久久福利影视| 黄色短视屏| 精品国产香蕉在线播出 | 黄色福利片| 国产网站免费视频| 国产视频一区二区在线观看| 亚洲第一页乱| 色综合久久天天综线观看| 日韩在线观看免费完整版视频| 二级特黄绝大片免费视频大片| 国产不卡精品一区二区三区| 99热热久久| 成人免费观看网欧美片| 久久久久久久男人的天堂| 国产成人欧美一区二区三区的| 国产高清视频免费观看| 日本特黄特黄aaaaa大片| 日韩中文字幕在线亚洲一区| 国产伦久视频免费观看视频| 国产一区二区高清视频| a级毛片免费观看网站| 91麻豆精品国产自产在线 | 九九九在线视频| 青青青草影院| 韩国三级视频网站| 九九久久99综合一区二区| 九九久久99| 亚洲wwwwww| 二级特黄绝大片免费视频大片| 国产视频在线免费观看| 精品国产一级毛片| 精品久久久久久影院免费| 色综合久久手机在线| 日日夜夜婷婷| 欧美a级v片不卡在线观看| 午夜欧美福利| 免费一级片网站| 日韩专区亚洲综合久久| 亚欧成人乱码一区二区| 亚洲爆爽| 精品视频在线观看视频免费视频| 国产亚洲精品aaa大片| 国产高清视频免费观看| 日韩一级精品视频在线观看| 九九久久国产精品大片| 国产91精品一区| 国产亚洲精品aaa大片| 黄视频网站在线免费观看| 精品在线观看一区| 日韩在线观看免费完整版视频| 黄色福利片| 国产一区免费观看| 沈樵在线观看福利| 成人a大片在线观看| 青青青草影院| 精品视频在线看| 日本特黄特黄aaaaa大片| 欧美国产日韩一区二区三区| 欧美电影免费| 国产91精品系列在线观看| 麻豆网站在线免费观看| 黄视频网站在线看| 国产一区精品| 四虎久久精品国产| 国产91视频网| 香蕉视频亚洲一级| 久久国产一区二区| 亚洲天堂一区二区三区四区| 欧美一级视频免费观看| 亚洲爆爽| 国产精品1024永久免费视频 | 你懂的福利视频| 国产91精品一区| 日韩中文字幕一区二区不卡| 欧美一区二区三区在线观看| 国产视频一区二区在线播放| 久久精品成人一区二区三区| 青青青草影院 | 亚久久伊人精品青青草原2020| 成人高清护士在线播放| 999精品影视在线观看| 91麻豆tv| 日日夜夜婷婷| 久久久久久久免费视频| 日韩专区亚洲综合久久| 尤物视频网站在线| 日韩在线观看免费完整版视频| 午夜在线亚洲男人午在线| 欧美激情一区二区三区视频 | 韩国三级视频在线观看| 麻豆网站在线免费观看| 九九九在线视频| 成人免费高清视频| 韩国毛片免费大片| 91麻豆精品国产高清在线| 青青久久精品国产免费看| 国产网站免费在线观看| 免费的黄色小视频| 久久国产一久久高清| 成人免费一级毛片在线播放视频| 久久国产精品永久免费网站| a级毛片免费全部播放| 亚洲爆爽| 午夜激情视频在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩中文字幕在线观看视频| 日韩中文字幕一区二区不卡| 国产成人啪精品视频免费软件| 欧美日本韩国| 国产美女在线观看| 久久国产一区二区| 中文字幕97| 91麻豆精品国产综合久久久|