Innodb中的鎖

来源:http://www.cnblogs.com/helloz/archive/2017/12/06/7995397.html
-Advertisement-
Play Games

Innodb中的鎖 共用鎖和排它鎖(Shared and Exclusive Locks) 共用鎖和排它鎖是行級鎖,有兩種類型的行級鎖 共用鎖(s lock)允許持有鎖的事務對行進行讀取操作 排它鎖(x lock)允許持有鎖的事務對行進行更新和刪除操作 事務a在行r上擁有共用鎖,則其他事務可以獲得r ...


Innodb中的鎖

共用鎖和排它鎖(Shared and Exclusive Locks)
  共用鎖和排它鎖是行級鎖,有兩種類型的行級鎖
    共用鎖(s lock)允許持有鎖的事務對行進行讀取操作
    排它鎖(x lock)允許持有鎖的事務對行進行更新和刪除操作

  事務a在行r上擁有共用鎖,則其他事務可以獲得r的共用鎖,無法獲得r的排它鎖,即可讀不可寫
  事務a在行r上擁有排它鎖,則其他事務既不能獲得共用鎖,也不能獲得排它鎖,即不可讀也不可寫而必須等待當前事務完成

意向鎖(Intention Locks)
  意向鎖是表級鎖,用來表示將會有哪種類型的行級鎖即將被使用,有兩種類型的意向鎖
    意向共用鎖(IS Locks):表明即將在表中的某一行上設置共用鎖(s lock)
    意向排它鎖(Ix Locks): 表明即將在表中的某一行上設置排它鎖(x lock)

  一個事務如果要獲得一個共用鎖(s lock)必須首先獲得一個意向共用鎖(is lock),一個事務如果要獲得一個排它鎖(x lock)則必須先獲得一個意向排它鎖(ix lock)
各種鎖級別的相容性

 XIXSIS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Compatible
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible


行級鎖(Record Locks)
  行級鎖總是鎖住索引記錄(index records),即便表沒有定義索引,innodb也會創建一個隱藏的聚簇索引,然後用這個索引來鎖住這一行。
間隙鎖(Gap Locks)
  間隙鎖是用於索引之間或第一個索引之前或最後一個索引之後的鎖, 當語句中有一個確定的索引值的時候,間隙鎖會降級為行級鎖。例如這個
    select * from child where id =100;
Next-Key Locks
  不知道怎麼翻譯了。這是行級鎖和間隙鎖的組合,也就是說這種類型的鎖會做作用於一條記錄上和它之前的間隙,不允許插入。
自增鎖(AUTO-INC Locks)
  一個特殊的表級鎖,用於帶有auto-increment選項的列上,它會讓你獲得連續的主鍵值。這個鎖的釋放在它的sql語句執行完成之時,而非事務結束之時,這樣其他的事務可以不必等到事務結束才獲得自增鎖。innodb_autoinc_lock_mode是用來配置這個鎖的。
Predicate Locks
謂詞鎖(不知道是不是這個意思),作用於空間索引(spatial indexes)。

常見sql語句的鎖級別
  innodb預設的隔離級別是可重覆讀(repeatable read),預設的讀取方式是一致性讀(consistent read),所謂一致性讀就是在你開啟事務的時候,innodb會保存一個時間戳,在此之後的改變都是不可見的。由於innodb是一個多版本存儲引擎(multi-versioned storage engine),它會保存改變的行之前的舊的數據以支持一些事務特性,例如併發和回滾。這些數據被存儲在表空間(tablespace)的一個叫rollback segment的數據結構里。這裡的數據會被用來重建之前的值來保證一致性讀(consistent read)。
    select ... from : 一致性讀,不需要鎖,除非隔離級別被設為串列化(serializable)。
    select ... from ... lock in share mode :在搜索條件里的每條記錄設置共用的next-key lock, 如果有特定的索引值則為行級鎖。
    select ... from ... for update :在搜索條件里的每條記錄設置排它的next-key lock, 如果有特定的索引值則為行級鎖。
    update ... where... 在搜索條件里的每條記錄設置排它的next-key lock, 如果有特定的索引值則為行級鎖。
    delete from ... where ... : 在搜索條件里的每條記錄設置排它的next-key lock, 如果有特定的索引值則為行級鎖。
    insert 語句設置一個排它鎖在插入的行上,為行級鎖。當有多個會話嘗試插入相同主鍵發生主鍵衝突時,可能會發生死鎖,因為在發生主鍵衝突時他們各自獲得了共用鎖,而都不能獲得排它鎖。
    insert ... on duplicate key update : 和之前的insert語句不同的是當發生主鍵衝突時,他們會獲得排它鎖而非共用鎖,這樣就避免了多個會話獲得共用鎖而發生死鎖。

手動加鎖
  select ... from ... lock in share mode
  select ... from ... for update

  lock tables tb_name [AS alias {read [local] | [low_priority] write }
    [,tb_name [AS alias {read [local] | [low_priority] write }...]
  unlock tables;
  read local允許在鎖定被保持時,執行非衝突性insert語句
  low_priority write鎖定來允許其它線程在該線程正在等待write鎖時獲得read鎖


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.從官網下載source insight4.0版本(不用下載,在後面已經把所有需要的文件都準備好了); 2.安裝source insightt4.0; 3.使用下載好的sourceinsight4.exe替換安裝在program file(x86)目錄下的sourceinsight4.exe; 4 ...
  • Rsync的文件同步實現 一、rsync 簡介 Rsync(remote synchronize)是一個遠程數據同步工具,簡要的概括就是主機於主機之間的文件目錄數據的一個同步。 它的特性如下: 可以鏡像保存整個目錄樹和文件系統。 可以很容易做到保持原來文件的許可權、時間、軟硬鏈接等等。 無須特殊許可權即 ...
  • 腳本書寫規範、shell腳本的執行方式、Shell中的變數說明、變數子串、shell中的數學運算 ...
  • 本節學習目的 1)分析printk()函數 2)使用prink()調試驅動 1.在驅動調試中,使用printk(),是最簡單,最方便的辦法 當uboot的命令行里的“console=tty1”時,表示printk()輸出在開發板的LCD屏上 當uboot的命令行里的“console=ttySA0,1 ...
  • 安裝環境: linux版本: ubuntu-16.04.3-desktop-amd64 mysql版本:mysql-boost-5.7.20.tar.gz 下載地址:https://dev.mysql.com/downloads/mysql/ mysql安裝前的準備工作: 1,安裝cmake工具 s ...
  • Linux重要目錄,以思維導圖Xmind方式展現,附帶Xmind文件下載地址。 ...
  • @echo off&color 3a&set c=0123456789abcdefghijklmnopqrstuvwxyz title 批量替換文件(文件夾)名 echo. echo 此批處理可批量替換本文件所在文件夾下所有文件的文件名。 echo.echo.&set /p strtemp1= 請輸 ...
  • 企業級緩存系統varnish應用與實戰 環境背景:隨著公司業務快速發展,公司的電子商務平臺已經聚集了很多的忠實粉絲,公司也拿到了投資,這時老闆想通過一場類似雙十一的活動,進行一場大的促銷,屆時會有非常多的粉絲訪問網站,你的總監與市場部門開完會後,確定活動期間會有平常10倍以上的訪問請求,總監要求大幅 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...