1. 程式人生 > >淺談InnoDB的next-key locking策略

淺談InnoDB的next-key locking策略


InnoDB 儲存引擎預設隔離級別為可重複讀(Repeatable Read),該隔離級別下加行鎖採用的是next-key locking 策略。


InnoDB支援行鎖(鎖定欄位含有索引的情況下,否則走表鎖),但鎖定方式並非簡單的鎖定指定行上的索引,而是分為3種鎖定演算法:
1)記錄鎖(Record Locks):鎖定指定行的索引項
2)Gap Locks:鎖定某一個範圍內的索引,但不包括記錄本身
3)間隙鎖定(Next-Key Locks):鎖定一個範圍內的索引,並且鎖定記錄本身   Next-Key Locks = Record Locks + Gap Locks
A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record


InnoDB在預設配置下(隔離級別:可重複讀;innodb_locks_unsafe_for_binlog=OFF:採用gap locking),對於索引的查詢採用 next-key locks。這樣做避免了幻讀現象的產生。
By default, InnoDB operates in REPEATABLE READ transaction isolation level and with the innodb_locks_unsafe_for_binlog system variable disabled. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows
特別的,
1、當鎖定的索引項含有唯一屬性的時候,Next-Key Lock 會進行優化,將其降級為Record Lock,即僅鎖住索引本身,不是範圍。
2、當唯一索引是由多個列組成,而query僅查詢多個列中的其中一個,則依然使用 Next-key lock。
3、通過主鍵或者唯一索引來鎖定不存在的值,則依然使用 Next-key lock。。


強制關閉Gap Lock,僅使用記錄鎖從而避免阻塞(有幻讀的風險):配置引數 innodb_locks_unsafe_for_binlog = 1 或者隔離級別設為 READ COMMITTED
By default, the value of innodb_locks_unsafe_for_binlog is 0 (disabled), which means that gap locking is enabled: InnoDB uses next-key locks for searches and index scans. To enable the variable, set it to 1. This causes gap locking to be disabled: InnoDB uses only index-record locks for searches and index scans.

The effects of enabling innodb_locks_unsafe_for_binlog are the same as setting the transaction isolation level toREAD COMMITTED

(1)採用next-key locks的InnoDB無法插入除了鎖定行外的其他行的測試案例:

http://www.cnblogs.com/zhoujinyi/p/3435982.html

(2)何登成 --- MySQL加鎖處理分析

http://hedengcheng.com/?p=771

(3)《深入淺出MySQL資料庫開發優化與管理維護》開發篇

(4)https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html

(5)https://dev.mysql.com/doc/refman/5.5/en/innodb-consistent-read.html


相關推薦

InnoDB的next-key locking策略

InnoDB 儲存引擎預設隔離級別為可重複讀(Repeatable Read),該隔離級別下加行鎖採用的是next-key locking 策略。 InnoDB支援行鎖(鎖定欄位含有索引的情況下,否則走表鎖),但鎖定方式並非簡單的鎖定指定行上的索引,而是分為3種鎖定演算法

加速因子在策略中的意義

重新 以及 log 當前 表現 做到 image 運行 建立 他站鏈接:淺談加速因子在策略中的意義 NO:01沒有完美的交易系統,但是卻有完美的交易哲學。交易哲學、交易策略和資金管理三者缺一不可,才能構成正期望的交易系統。投機依賴價格的移動獲得盈利(低買高賣或高買更高賣)。

資料庫主鍵策略

資料庫表的主鍵很多童鞋都非常熟悉了,主鍵就是Primary Key,簡稱PK。 資料庫主鍵的作用是唯一標識一條記錄,所以在同一張表中,任意一條記錄的主鍵都是唯一的,不然,資料庫系統就無法根據主鍵直接定位記錄。 雖然資料庫系統本身對主鍵沒有特別的要求,但是,寫程式的時候,要考慮清楚使用什麼型別的主鍵。正

撞庫防禦策略

2014,12306遭遇撞庫攻擊,13萬資料洩露;2015,烏雲網上爆出網易郵箱過億使用者資料由於撞庫洩露;資料洩露愈演愈烈,撞庫登入成為網站的一大安全威脅,今天小編就和大家探討一下如何才能夠有效的防止撞庫攻擊。俗語知己知彼,百戰不殆,小編在網上找了個撞庫教程整理給大家看

Java記憶體分配策略

Java 記憶體分配策略 Java 程式執行時的記憶體分配策略有三種,分別是靜態分配,棧式分配,和堆式分配,對應的,三種儲存策略使用的記憶體空間主要分別是靜態儲存區(也稱方法區)、棧區和堆區。 靜態儲存區(方法區):主要存放靜態資料、全域性 static 資料和常量。這

InnoDB的MVCC策略

InnoDB 是採用了多版本併發控制(MVCC)的一套儲存引擎,它在表空間內一個被稱為“rollback segment”的地方,記錄了有變更的資料行的舊版本(修改前)資訊,用來支援一些事務功能:例如一致性和回滾。InnoDB利用“rollback segment”裡的這

java內存分配和回收策略

內存空間 高效率 cde map details 閾值 老年代 total 關於 一、導論   java技術體系中所提到的內存自動化管理歸根結底就是內存的分配與回收兩個問題,之前已經和大家談過java回收的相關知識,今天來和大家聊聊java對象的在內存中的分配。通俗的講,對

Key-value 存儲——SILT

雲存儲 支持 amazon mem col merge 失效 組成 臨時 摘要:本文以文章SILT: A Memory Efficient High Performance Key-Value Store 為基礎,探討SILT存儲系統是如何實現內存占用低和高性能的設計目標,

設計模式之——strategy模式(策略模式)

兩個 事情 操作 none 要去 編碼 淺談 一點 進行 strategy模式,即策略模式。個人覺得吧,策略模式更多的是一種思維方式。 首先我們要知道,為什麽需要策略模式。舉個例子,比如用程序輸出今天下午去玩什麽。 PlayGame 玩遊戲 package site.wa

並發性模型的測試策略

訪問 記錄鎖 另一個 程序 控制 取數據 並發 所有 有一個 目前市面上的不少軟件都會用到多方登錄或者編輯的並發性問題,針對並發性問題有若幹種方法,主要有以下幾種: 保守方式:這種並發性模型在數據上加了鎖。如果一個用戶已經打開了一條記錄,那麽在允許編輯的環境中,系統就會拒

大型網際網路企業入侵檢測及防護策略

前言 如何知道自己所在的企業是否被入侵了?是沒人來“黑”,還是因自身感知能力不足,暫時還無法發現?其實,入侵檢測是每一個大型網際網路企業都要面對的嚴峻挑戰。價值越高的公司,面臨入侵的威脅也越大,即便是Yahoo這樣的網際網路鼻祖,在落幕(被收購)時仍遭遇全量資料失竊的事情。安全無小事,一旦網際網路公司被成功

設計模式之策略模式以及簡單例子

null 引用 == names bsp args cto 封裝 方法 設計模式之策略模式 策略模式定義了算法類,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立於使用算法的客戶。 策略模式是對算法的包裝,是把使用的責任和

電商專案解決高併發的問題的策略

前言:        本文乃是文章作者在實際電商專案開發參與過程中關於本專案中解決高併發方案的一些思路總結,由於本人水平有限,不足之處,望請留言指正!        在專案中解決高併發並非解決其中的某一個環節或點

自己知道的首屏載入時間的優化策略

縮小webpack或者其他打包工具生成的包的大小 為了做到這一點,需要做到儘可能的減少生產環境下依賴的庫數量,儘可能的按需引用,減少無用程式碼佔的空間。 我剛開始優化的時候,就不知道從何處優化起,而且根本不知道生成的包中哪個依賴佔據著空間,我還一度挨個刪去庫引

簡單工作流設計——責任鏈模式配合策略與命令模式的實現

本文以專案中的一個工作流模組,演示責任鏈模式、策略模式、命令模式的組合實現! 流程簡介 最近在做的一個專案,涉及到的是一個流程性質的需求。關於工程機械行業的服務流程:服務任務流程和備件發運流程。 專案之初,需求不是很清晰,算是演化模型吧。先出一個簡單版本,然後根據使用者的

MySQL使用可重複讀作為預設隔離級別的原因(二)-》Innodb鎖機制:Next-Key Lock

資料庫使用鎖是為了支援更好的併發,提供資料的完整性和一致性。InnoDB是一個支援行鎖的儲存引擎,鎖的型別有:共享鎖(S)、排他鎖(X)、意向共享(IS)、意向排他(IX)。為了提供更好的併發,InnoDB提供了非鎖定讀:不需要等待訪問行上的鎖釋放,讀取行的一個快照。該方法是通過InnoDB的一個特

大型網際網路的企業入侵檢測及防護策略

文章內容 前言 如何知道自己所在的企業是否被入侵了?是沒人來“黑”,還是因自身感知能力不足,暫時還無法發現?其實,入侵檢測是每一個大型網際網路企業都要面對的嚴峻挑戰。價值越高的公司,面臨入侵的威脅也越大,即便是Yahoo這樣的網際網路鼻祖,在落幕(被收購)時仍遭遇全量資料失竊的事情。安全

PHP陣列鍵值Key越界後涉及的資料型別及值範圍

做專案時遇到一個問題: 獲取專案介面返回的資料存入PHP陣列作為Key,但是取出來值就不一樣了,嗶--- 經過一番大腦回路,發現竟然是PHP陣列Key越界,既然遇到就簡單記錄一下,哎,這一生犯的錯實在

深度學習中超引數調整策略

歡迎訪問Oldpan部落格,分享人工智慧有趣訊息,持續醞釀深度學習質量文。 前言 深度學習中,設計模型以及保證模型的正確性是首要需要考慮的。當模型設定完成時,理論上模型不存在問題,實現效果也通過計算可以復現出來。一切準備就緒後,那麼接下來需要操作的就是——調參了。

設計模式之簡單工廠模式與策略模式

本文主要是關於面向物件程式設計(OOP)的設計模式,瞭解優秀軟體設計的演變過程比學習優秀的設計本身更有價值,因為設計演變的過程蘊藏著巨大的智慧,是一代一代程式設計師的思想的結晶。通過學習設計模式,設計出易於維護、擴充套件、複用以及靈活性好的程式;使用多型、繼承、