搜尋
首頁資料庫mysql教程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刪除
    MySQL與Sqlite有何不同?MySQL與Sqlite有何不同?Apr 24, 2025 am 12:12 AM

    MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

    MySQL中的索引是什麼?它們如何提高性能?MySQL中的索引是什麼?它們如何提高性能?Apr 24, 2025 am 12:09 AM

    MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

    說明如何使用MySQL中的交易來確保數據一致性。說明如何使用MySQL中的交易來確保數據一致性。Apr 24, 2025 am 12:09 AM

    在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

    在哪些情況下,您可以選擇PostgreSQL而不是MySQL?在哪些情況下,您可以選擇PostgreSQL而不是MySQL?Apr 24, 2025 am 12:07 AM

    選擇PostgreSQL而非MySQL的場景包括:1)需要復雜查詢和高級SQL功能,2)要求嚴格的數據完整性和ACID遵從性,3)需要高級空間功能,4)處理大數據集時需要高性能。 PostgreSQL在這些方面表現出色,適合需要復雜數據處理和高數據完整性的項目。

    如何保護MySQL數據庫?如何保護MySQL數據庫?Apr 24, 2025 am 12:04 AM

    MySQL數據庫的安全可以通過以下措施實現:1.用戶權限管理:通過CREATEUSER和GRANT命令嚴格控制訪問權限。 2.加密傳輸:配置SSL/TLS確保數據傳輸安全。 3.數據庫備份和恢復:使用mysqldump或mysqlpump定期備份數據。 4.高級安全策略:使用防火牆限制訪問,並啟用審計日誌記錄操作。 5.性能優化與最佳實踐:通過索引和查詢優化以及定期維護兼顧安全和性能。

    您可以使用哪些工具來監視MySQL性能?您可以使用哪些工具來監視MySQL性能?Apr 23, 2025 am 12:21 AM

    如何有效監控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。 1.使用mysqladmin查看連接數。 2.用SHOWGLOBALSTATUS查看查詢數。 3.PMM提供詳細性能數據和圖形化界面。 4.MySQLEnterpriseMonitor提供豐富的監控功能和報警機制。

    MySQL與SQL Server有何不同?MySQL與SQL Server有何不同?Apr 23, 2025 am 12:20 AM

    MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显著差异,选择时需考虑项目规模和未来扩展性。

    在哪些情況下,您可以選擇SQL Server而不是MySQL?在哪些情況下,您可以選擇SQL Server而不是MySQL?Apr 23, 2025 am 12:20 AM

    在需要高可用性、高級安全性和良好集成性的企業級應用場景下,應選擇SQLServer而不是MySQL。 1)SQLServer提供企業級功能,如高可用性和高級安全性。 2)它與微軟生態系統如VisualStudio和PowerBI緊密集成。 3)SQLServer在性能優化方面表現出色,支持內存優化表和列存儲索引。

    See all articles

    熱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

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

    熱工具

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    SublimeText3 英文版

    SublimeText3 英文版

    推薦:為Win版本,支援程式碼提示!

    SublimeText3 Linux新版

    SublimeText3 Linux新版

    SublimeText3 Linux最新版

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript開發工具

    mPDF

    mPDF

    mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),