目錄
一、交易隔離機制的選擇
二、表格級鎖定&行級鎖定
三、排它鎖定(Exclusive)和共用鎖定(Shared)
1. 測試不同交易之間排它鎖和共享鎖的相容性
首頁 資料庫 mysql教程 MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

Jun 03, 2023 am 10:49 AM
mysql

    一、交易隔離機制的選擇

    • #如果我們完全不管,使用未提交讀取的事務隔離機制,任由這些執行緒並發操作資料庫,那就會出現髒讀(讀取了未commit的資料)、不可重複讀取(兩次查詢值不同)、幻讀(兩次查詢資料量不同)等問題,資料的安全性最低,優點是並發效率非常高,一般不會使用

    • 如果我們序列化(靠鎖定實現),透過鎖定給所有的事務都排序,雖然資料的安全性提高了,並發的效率就太低了,一般也不會使用

    • 所以我們一般用的是已提交讀取、可重複讀這兩個隔離級別,平衡了資料的安全性,一致性以及並發的效率,是由MVCC多版本並發控制實現的(MVCC是已提交讀取和可重複讀取的原理,鎖定是串行化的原理)

    二、表格級鎖定&行級鎖定

    #表級鎖:整張表加鎖。開銷小(因為不用去找表的某一行的記錄進行加鎖,要修改這張表,直接申請加這張表的鎖),加鎖快,不會出現死鎖;鎖粒度大,發生鎖衝突的機率高,並發度低

    行級鎖定:對某行記錄加鎖。開銷大(需要找到表中對應的記錄,有搜表搜尋引的過程),加鎖慢,會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,並發度高

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    InnoDB儲存引擎支援交易處理,表支援行級鎖定,並發能力更好

    1. InnoDB行鎖是透過給索引上的索引項目加鎖來實現的,而不是給表的行記錄加鎖實現的,這就意味者只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則InnoDB將使用表鎖

    2. 由於InnoDB的行鎖實作是針對索引欄位新增的鎖,不是針對行記錄加的鎖,因此雖然存取的是InnoDB引擎下表的不同行,但如果使用相同的索引字段作為過濾條件,仍然會發生鎖定衝突,只能串行進行,不能並發進行

    3. 即使SQL中使用了索引,但是經過MySQL的優化器後,如果認為全表掃描比使用索引效率高,此時會放棄使用索引,因此也不會
      使用行鎖,而是使用表鎖,例如對一些很小的表,MySQL就不會去使用索引

    三、排它鎖定(Exclusive)和共用鎖定(Shared)

    • 排它鎖,又稱為X鎖,寫鎖

    • 共享鎖,又稱為S鎖,讀鎖

    讀讀(SS)之間是可以相容的,但是讀寫(SX、SX)之間,寫寫(XX)之間是互斥的

    對事務加X和S鎖之間有以下的關係:

    • 一個事務對資料物件A加了S 鎖,可以對A進行讀取操作但不能進行update操作,加鎖期間其它事務能對A加S鎖但不能加X 鎖

    • 一個事務對資料物件A加了X 鎖,就可以對A進行讀取和更新,加鎖期間其它事務不能對A加任何鎖

    顯示加鎖:select … lock in share mode強制取得共享鎖,select … for update取得排它鎖

    1. 測試不同交易之間排它鎖和共享鎖的相容性

    我們先查看表格的SQL以及內容

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    看隔離等級:

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用##首先開啟一個事務,給id=7的資料加上排它鎖定

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用在用另一個客戶端開啟事務

    我們用另一個事務的服務執行緒為id=7的資料加上排它鎖,阻塞了

    我們嘗試給id=7的資料加上共享鎖,還是阻塞了

    總結:不同事務之間對於資料的鎖,只有SS鎖可以共存,XX、SX、XS都不能共存######2. 測試行鎖加在索引項目上############其實行鎖定是加在索引樹上的#######

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    用表格的無索引欄位作為過濾條件

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    #交易2現在同樣想取得這條記錄的排它鎖,可想而知地失敗了;那現在事務2取得chenwei的記錄的排它鎖,試試能不能成功

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    InnoDB是支援行鎖的,剛才以主鍵id為過濾條件時,事務1和事務2取得不同行的鎖定是可以成功的。然而現在我們發現取得name為chenwei的排它鎖也取得不到了,這是為什麼?讓我們解釋一下:

    InnoDB的行鎖是透過將索引項加鎖來實現的,而不是為表的行記錄加鎖實現的

    而我們用name作為篩選條件沒有用到索引,自然就不會使用行鎖,而是使用表鎖。這就意味著只有透過索引檢索數據,InnoDB才使用行級鎖,否則InnoDB都會使用表鎖!!!

    我們給name欄位加上索引

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    ##我們發現,加上索引後,兩個交易可以取得到不同行的排它鎖定(for update),再一次證明了InnoDB的行鎖定是加在索引項目上的

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    因為現在name走的是索引, 透過zhangsan在輔助索引樹上找到它所在行記錄的id是7,然後

    到主鍵索引樹上,取得對應行記錄的排他鎖(個人猜測應該是輔助索引樹和主鍵索引樹對應的記錄都加了鎖)

    四、串列化隔離等級測試

    (所有的交易都使用排它鎖定或共用鎖定,不需要使用者手動加鎖)

    設定串列化隔離等級

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    兩個交易可以同時取得共享鎖定(SS共存)

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    #現在讓事務2插入資料

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    ##此時由於insert需要加排它鎖,但由於事務1已經對整張表添加了共享鎖,事務2無法再對錶成功加鎖(SX不共存)

    rollback一下

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    因為我們為name加上了索引,以上的select相當於為name為zhangsan的資料加上了行共享鎖定

    交易2 update

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    事務2不能update,因為此時已經被事務1的共享鎖定鎖住了整個表

    事務2在輔助索引樹上找zhangsan ,找到對應的主鍵值,然後去主鍵索引樹找到對應的記錄,但是發現這行記錄已經被共享鎖鎖住了,事務2可以獲取共享鎖,但是不能獲取排他鎖

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    我們用主鍵索引id試試看能不能update

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    #依然阻塞住了,雖然我們where後面的欄位現在使用的id而不是name,但是name也是透過輔助索引樹找到對應的主鍵,再到主鍵索引樹上找對應的記錄,而主鍵索引樹上的記錄加了鎖

    (個人猜想應該是輔助索引樹和主鍵索引樹對應的資料都加了鎖)

    我們update id=8的數據,成功了。只為id為7的行資料加上了行鎖,因此我們可以成功操作id為8的資料

    MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用

    #有索引,則使用行鎖;沒有索引,則使用表鎖。 ###

    表級鎖還是行級鎖說的是鎖的粒度,共享鎖和排他鎖說的是鎖的性質,不管是表鎖還是行鎖,都有共享鎖和排他鎖的區分

    以上是MySQL表鎖、行鎖、排它鎖及共用鎖怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    <🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系統,解釋
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1665
    14
    CakePHP 教程
    1424
    52
    Laravel 教程
    1322
    25
    PHP教程
    1270
    29
    C# 教程
    1249
    24
    laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

    Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

    MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

    MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

    MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

    MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

    解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

    在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

    laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

    文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

    解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 Apr 18, 2025 am 08:42 AM

    在使用Thelia開發電商網站時,我遇到了一個棘手的問題:MySQL模式設置不當,導致某些功能無法正常運行。經過一番探索,我找到了一個名為TheliaMySQLModesChecker的模塊,它能夠自動修復Thelia所需的MySQL模式,徹底解決了我的困擾。

    MySQL:結構化數據和關係數據庫 MySQL:結構化數據和關係數據庫 Apr 18, 2025 am 12:22 AM

    MySQL通過表結構和SQL查詢高效管理結構化數據,並通過外鍵實現表間關係。 1.創建表時定義數據格式和類型。 2.使用外鍵建立表間關係。 3.通過索引和查詢優化提高性能。 4.定期備份和監控數據庫確保數據安全和性能優化。

    MySQL:解釋的關鍵功能和功能 MySQL:解釋的關鍵功能和功能 Apr 18, 2025 am 12:17 AM

    MySQL是一個開源的關係型數據庫管理系統,廣泛應用於Web開發。它的關鍵特性包括:1.支持多種存儲引擎,如InnoDB和MyISAM,適用於不同場景;2.提供主從復制功能,利於負載均衡和數據備份;3.通過查詢優化和索引使用提高查詢效率。

    See all articles