1. 程式人生 > >SQL語句加鎖分析

SQL語句加鎖分析

背景
MySQL中SQL加鎖的情況十分複雜,不同隔離級別、不同索引型別、索引是否命中的SQL加鎖各不相同。 然而在分析死鎖過程當中,熟知各種情況的SQL加鎖是分析死鎖的關鍵,因此需要將MySQL的各種SQL情況加鎖進行分析總結。    基礎知識
MVCC
  • 快照讀
    • 讀取歷史版本,從undo log中讀取行記錄的快照;這樣讀行就不需要等待鎖資源,提高了併發;
  • 當前讀
    • 讀取最新版本,並且當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。
    • 加鎖讀、插入、更新、刪除等操作均屬於當前讀
  將插入,更新,刪除歸為當前讀是因為這些操作均包含讀取當前記錄的操作。拿update table set ? where ?來講, 當Update SQL被髮給MySQL後,MySQL Server會根據where條件,讀取第一條滿足條件的記錄,然後InnoDB引擎會將第一條記錄返回,並加鎖 (current read)。 待MySQL Server收到這條加鎖的記錄之後,會再發起一個Update請求,更新這條記錄。一條記錄操作完成,再讀取下一條記錄,直至沒有滿足條件的記錄為止。 因此,Update操作內部,就包含了一個當前讀。同理,Delete操作也一樣。Insert操作會稍微有些不同,簡單來說,就是Insert操作可能會觸發Unique Key的衝突檢查,也會進行一個當前讀。   注意: Innodb當前讀加鎖是一條一條進行,先對一條滿足條件的記錄加鎖,返回給MySQL Server做一些DML操作,然後在讀取下一條加鎖,直至讀取完畢。    Two-phase locking Two-Phase Locking,說的是鎖操作分為兩個階段:加鎖階段與解鎖階段,並且保證加鎖階段與解鎖階段不相交。 加鎖階段:只加鎖,不放鎖。解鎖階段:只放鎖,不加鎖。    隔離級別   資料庫的隔離現象與隔離級別如下圖所示  
      髒讀現象:即A連線,未提交的事務,B連線的事務可以看到;   NONREPEATABLE READ(不可重複讀)現象: A連線,提交的事務,B連線的事務中可以看到,這樣在B連線中的事務,就可以看到A連線事務提交前,和提交後兩種狀態; 注意:不可重複讀針對update,delete   PHANTOM READ(幻讀)現象: A連線,提交的事務,B連線的事務可以看到,這樣在B連線中的事務,就可以看到A連線事務提交前,和提交後兩種狀態; 注意:幻讀針對insert;   innodb事務引擎,通過間隙鎖 粗暴 將RR隔離級別的幻讀現象消除,這也是RR與RC的主要區別。   基礎SQL組合分析
使用下面這張 students 表作為例項,其中 id 為主鍵,no(學號)為二級唯一索引, score(學分)為二級非唯一索引,age(年齡)無索引。
  我們只分析基礎SQL,它只包含一個 WHERE 條件,等值查詢或範圍查詢,根據條件型別以及隔離級別不同(主要分析最常用的RR,RC)我們主要分析一下情況:    聚簇索引,索引命中 SQL select * from students where id = 20  for update,  在 RC 和 RR 隔離級別下加鎖情況一樣,都是對 id 這個聚簇索引加 X 鎖,如下:   唯一索引,索引命中 SQL:select * from students where num = 135 for update; 若檢索唯一索引,那麼SQL需要加兩個X鎖,一個對應唯一索引上的num = 135的記錄,另一把鎖對應於聚簇索引上的[id=35]的記錄。
  二級索引,索引命中 SQL:select * from students where score= 91  for update;  如此例子當中如法插入score 值有[77,99),注意邊界值。前邊界77是無法插入的,後邊界99則可以插入。 此外 select * from students where score= 77  for update,是不用等待鎖的。

相關推薦

MySQL innodb中各種SQL語句分析

utf8 mea 插入記錄 隔離 無法自動 change lac 進行 而不是 概要 Locking read( SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),UPDATE以及DELETE語句通常會在

SQL語句分析

背景 MySQL中SQL加鎖的情況十分複雜,不同隔離級別、不同索引型別、索引是否命中的SQL加鎖各不相同。 然而在分析死鎖過程當中,熟知各種情況的SQL加鎖是分析死鎖的關鍵,因此需要將MySQL的各種SQL情況加鎖進行分析總結。    基礎知識 MVCC 快照讀 讀取歷史版本,

一分鐘明白各種SQL語句的什麼——《深究Mysql

一、正常查詢 在4個事務隔離級別中,除了在序列化(Serializable)時會加共享鎖,其他的都不加鎖,即快照讀。 二、加了鎖的查詢 加鎖select主要是指: select ... for update select ... in share mod

sql語句的優化分析

onu sele begin 博客 很多 text select 柯南 不想 轉自:http://www.cnblogs.com/knowledgesea/p/3686105.html 開門見山,問題所在 sql語句性能達不到你的要求,執行效率讓你忍無可忍,一般會時下

MySQL的並發控制與分析

開啟 bubuko 最新版本 行數據 我們 控制 刪除 阻塞 一致性 本文主要是針對MySQL/InnoDB的並發控制和加鎖技術做一個比較深入的剖析,並且對其中涉及到的重要的概念,如多版本並發控制(MVCC),臟讀(dirty read),幻讀(phantom read),

【轉】【MySQL】MySQL的併發控制與分析

https://www.cnblogs.com/yelbosh/p/5813865.html  本文主要是針對MySQL/InnoDB的併發控制和加鎖技術做一個比較深入的剖析,並且對其中涉及到的重要的概念,如多版本併發控制(MVCC),髒讀(dirty read),幻讀(phantom read

1-2 【包子mysql系列】, 對mysql的innoDB分析

innoDB的事務,是基於鎖來實現的,用到事務不自然就會用到鎖,而如果對鎖理解的不通透,很容易造成線上問題。 資料庫加鎖的分析,和事務的引擎,隔離級別,索引,主鍵索引都有關係, 如果去考慮引擎和各種隔離級別的話,就會很複雜了,所以下面都是基於innoDB和RR的隔離級別進行分析:   表結構

MySQL的併發控制和分析

本文主要是針對MySQL/InnoDB的併發控制和加鎖技術做一個比較深入的剖析,並且對其中涉及到的重要的概念,如多版本併發控制(MVCC),髒讀(dirty read),幻讀(phantom read),四種隔離級別(isolation level)等作詳細的闡述,並且基於一個簡單的例子,對MySQ

mysql 分析與實踐

一序      本文分為兩個部分,第一部分主要基於何登成大神的文章。何博士作為阿里資料庫核心團隊大神。文章更是深入淺出。膜拜一下:原文地址如下  http://hedengcheng.com/?p=771    第二部分介紹常見的實踐注意事項。 二 背景   MVCC

mysql分析

分析場景 1.1 工具:mysql5.5.53,在windows開啟兩個mysql命令列,m1、m2、m3,m1執行更新、刪除操作,m2查詢,m3查詢事務 1.2 表結構:兩個欄位,一個id,一個price 1.3 刪除SQL:delete from t1 w

史上最全的select分析(Mysql)

引言 大家在面試中有沒遇到面試官問你下面六句Sql的區別呢 select * from table where id = ? select * from table where&nb

【原創】驚!史上最全的select分析(Mysql)

引言 大家在面試中有沒遇到面試官問你下面六句Sql的區別呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode sele

【python資料探勘課程】十二.Pandas、Matplotlib結合SQL語句對比圖分析

一. 直方圖四圖對比        資料庫如下所示,包括URL、作者、標題、摘要、日期、閱讀量和評論數等。        執行結果如下所示,其中繪製多個圖的核心程式碼為:        p1 = plt.subplot(221)        plt.bar(ind, num

MySQL分析(總結分析各種情況)

參考:MySQL 加鎖處理分析。該文已經講的很詳盡了,也易懂,下面僅僅是個人做的總結。一、 背景1.1 隔離級別1.2 加鎖過程  逐條處理,逐條加鎖。1.3 兩階段鎖2PL1.4 gap鎖  gap鎖是間隙鎖,即相鄰兩條有效記錄間隙的鎖(鎖的是間隙),它是針對insert的,用來解決幻讀的發生。它會阻塞in

【python資料探勘課程】十一.Pandas、Matplotlib結合SQL語句視覺化分析

這是非常好的一篇文章,可以認為是我做資料分析的轉折點,為什麼呢?因為這是我做資料分析第一次引入SQL語句,然後愛不釋手;結合SQL語句返回結果進行資料分析的效果真的很好,很多大神看到可能會笑話晚輩,但是如果你是資料分析的新人,那我強烈推薦,尤其是結合網路爬蟲進行資料分析的。希

SQL語句優化技術分析

一、操作符優化1、IN 操作符 用IN寫出來的SQL的優點是比較容易寫及清晰易懂,這比較適合現代軟體開發的風格。但是用IN的SQL效能總是比較低的,從Oracle執行的步驟來分析用IN的SQL與不用IN的SQL有以下區別:ORACLE試圖將其轉換成多個表的連線,如果轉換不成功

DLA SQL分析函式:SQL語句審計與分析的利器

1. 簡介 Data Lake Analytics最新release一組SQL內建函式,用來進行SQL語句的分析、資訊提取,方

MySQL · 原始碼分析 · 常用SQL語句的MDL原始碼分析

前言 MySQL5.5版本開始引入了MDL鎖用來保護元資料資訊,讓MySQL能夠在併發環境下多DDL、DML同時操作下保持元資料的一致性。本文用MySQL5.7原始碼分析了常用SQL語句的MDL加鎖實現。 MDL鎖粒度 MDL_key由namespac

MySQL死問題例項分析及解決方法(主要是SQL語句可能會產生的問題)

from: http://database.51cto.com/art/201108/286325.htm MySQL死鎖問題的相關知識是本文我們主要要介紹的內容,接下來我們就來一一介紹這部分內容,希望能夠對您有所幫助。 1、MySQL常用儲存引擎的鎖機制 MyISAM

SQLServer數據庫,表內存,實例名分析SQL語句

right log space _id 數據庫 con sys case sharp --數據庫內存分析 USE master go DECLARE @insSize TABLE(dbName sysname,checkTime VARCHAR(19),dbSize VA