04_記錄鎖

記錄鎖(Record Lock)

文章目錄

    • 記錄鎖(Record Lock)
        • 簡介
        • 原理
        • 加鎖流程
        • 鎖類型
        • 使用場景
        • 示例
        • 與其他鎖的對比
        • 結論

簡介

MySQL 中的記錄鎖(Record Lock)是行級鎖的一種,用于鎖定數據庫表中的特定行。這種鎖是 MySQL InnoDB 存儲引擎提供的行級鎖機制的一部分,直接作用于存儲引擎層面的索引記錄上,即鎖定單個或多個行記錄。

這種鎖的主要目的是控制對單個數據行的并發訪問,從而支持更高級別的事務隔離,并減少數據操作沖突,提高系統的并發能力,保證數據的一致性和完整性。


原理

當一個事務對某行加記錄鎖時,實際上是對該行的索引記錄(主鍵索引)進行鎖定。如果該表沒有定義索引,InnoDB 會隱式創建一個聚簇索引(也稱為主鍵索引),并基于該索引加鎖。

當事務嘗試修改數據時,InnoDB會自動在被修改的記錄上加上排他鎖(X鎖)。當事務嘗試讀取數據并且事務隔離級別要求這樣做時(如可重復讀),InnoDB也可能在被讀取的記錄上加上共享鎖(S鎖)。


加鎖流程
  1. 事務請求記錄鎖:事務發出對特定記錄加鎖的請求。
  2. 索引查找:通過索引找到需要鎖定的記錄。
  3. 加鎖操作:對找到的索引記錄加鎖(共享鎖或排他鎖)。如果 SQL 中不是操作的主鍵索引,那么會通過其他索引來查找到記錄,然后鎖定記錄的主鍵索引。
  4. 執行操作:持有記錄鎖的事務可以安全地對該記錄進行讀或寫操作。
  5. 釋放鎖:事務提交或回滾后,釋放記錄鎖。

鎖類型

記錄鎖包括共享鎖(S鎖)和排他鎖(X鎖):

  • 共享鎖(S鎖):允許多個事務同時讀取相同的記錄,但不允許修改。
  • 排他鎖(X鎖):只允許一個事務讀取或修改記錄,其他事務不能同時讀取或修改。

使用場景

記錄鎖主要在以下場景中使用:

  • 事務處理:在處理事務時,對需要修改的數據行加排他鎖,對需要讀取的數據行加共享鎖(取決于隔離級別),以保證事務的ACID屬性。
  • 并發控制:通過對不同行記錄加鎖,多個事務可以同時對不同的數據行進行操作,大大提高了數據庫的并發處理能力。在并發讀取場景下防止讀操作讀取到未提交的變更數據。
  • 避免更新沖突:在并發環境下,記錄鎖可以防止多個事務同時修改同一條記錄,從而避免數據更新沖突。

示例

假設有一個表 users,包含以下數據:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50)
);
  1. 事務1
START TRANSACTION;
-- 事務1在 id=1 的記錄上加排他鎖
SELECT * FROM users WHERE id = 1 FOR UPDATE;
  1. 事務2
START TRANSACTION;
-- 事務2嘗試在 id=1 的記錄上加共享鎖,會被阻塞,等待事務1釋放排他鎖
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;

在以上示例中:

  • 事務1在 id=1 的記錄上加了排他鎖(X鎖),因此其他事務不能同時讀取或修改該記錄。
  • 事務2嘗試在 id=1 的記錄上加共享鎖(S鎖),但由于記錄已被事務1鎖定,因此需要等待事務1釋放鎖后才能繼續操作。

與其他鎖的對比
鎖類型鎖定粒度適用范圍并發性能使用場景
表鎖表級別整個表DDL 操作、大批量更新
行鎖(記錄鎖)行級別特定行(索引記錄)高并發讀寫
意向鎖表級別表明意向在某些行上加鎖行鎖和表鎖混合使用
間隙鎖行級別索引記錄之間的間隙防止幻讀
插入意向鎖行級別索引記錄之間的間隙高并發插入

結論

記錄鎖在 MySQL 中是實現行級別并發控制的重要機制,通過鎖定特定記錄來防止數據的并發修改,保證數據的一致性和完整性。在高并發訪問場景中,記錄鎖提供了精細的并發控制能力,有助于提升系統的性能和可靠性。根據不同的需求和使用場景,可以選擇合適的鎖類型來實現最佳的并發控制策略。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35196.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始做題:老照片中的密碼

老照片中的密碼 1.題目 1.1 給出圖片如下 1.2 給出如下提示 這張老照片中的人使用的是莫爾斯電報機,莫爾斯電報機分為莫爾斯人工電報機和莫爾斯自動電報機(簡稱莫爾斯快機)。莫爾斯人工電報機是一種最簡單的電報機,由三個部分組…

SelfReg-UNet:解決UNet語義損失,增強特征一致性與減少冗余的優化模型

SelfReg-UNet:解決UNet語義損失,增強特征一致性與減少冗余的優化模型 提出背景拆解類比:整理書架語義一致性正則化內部特征蒸餾為什么 UNet 會有語義損失? 提出背景 論文:https://arxiv.org/pdf/2406.14896 代碼&…

c++內存管理_復習

new與placement new new: 先調用operator new(大小),而operator new()會調用malloc嘗試分配內存,失敗則調用_callnewh()來釋放內存,直至分配成功 可以設置分配失敗的處理函數:將寫好的處理函數作為參數傳入set_new_han…

Vue3 使用 Vue Router 時,params 傳參失效

前言: 在寫項目的時候,使用了 vue-router 的 params 進行傳參,但是在詳情頁面中一直獲取不到參數。原因:Vue Router 在2022-8-22的那次更新后,使用這種方式在新頁面上無法獲取! 正文: 在列表頁進…

deeplabcut

import pandas as pd import h5py import pickle import json import os # 讀取 CSV 文件 csv_file_path /mnt/data/CollectedData_dlc.csv csv_data pd.read_csv(csv_file_path) # 讀取 H5 文件 h5_file_path /mnt/data/CollectedData_dlc.h5 with h5py.File(h5_file_pat…

LeetCode題練習與總結:只出現一次的數字Ⅱ--137

一、題目描述 給你一個整數數組 nums ,除某個元素僅出現 一次 外,其余每個元素都恰出現 三次 。請你找出并返回那個只出現了一次的元素。 你必須設計并實現線性時間復雜度的算法且使用常數級空間來解決此問題。 示例 1: 輸入:n…

K8S日常運維手冊

Kubernetes(簡稱 K8S)是一種廣泛使用的容器編排平臺,能夠自動化部署、擴展和管理容器化應用。對于運維人員來說,掌握 Kubernetes 的日常運維技能是確保系統穩定運行的關鍵。本文將介紹一些 Kubernetes 日常運維的基本操作與技巧&a…

虛擬機裝入kali linux

VMware 首先需要先安裝VMware Workstation Pro可以根據這篇文章來下載VMware 下載kali linux Installer Images VS Virtual Machines Installer Images(安裝鏡像)Virtual Machines(虛擬機) 直接訪問硬件,定制內核…

Matlab|【防騙帖】考慮時空相關性的風電功率預測誤差建模與分析

目錄 1 主要內容 2 部分程序 3 下載鏈接 1 主要內容 這個程序《考慮時空相關性的風電功率預測誤差建模與分析》畫的圖片非常漂亮,和原文獻基本一致,但是實際上內容并未實現出來,主要就是利用現有的風電預測的數據和結果做了相關的圖&#…

【數據結構】(C語言):鏈表

鏈表: 基本單位是節點。節點至少兩部分:數據,下一個數據的地址。頭指針head,始終指向鏈表的第一個節點。若沒有節點,則headNULL。鏈表在內存中是非連續的。不能使用索引(下標)查找元素。只能從…

解決:Xshell通過SSH協議連接Ubuntu服務器報“服務器發送了一個意外的數據包,received:3,expected:20”

下圖所示: 日志也基本看不出來問題在哪,只是說斷開了連接大概是驗證失敗。有幸在某論壇評論區找到了原因,是因為我的xshell版本太低了而服務器的ssh版本太高,高版本的ssh默認屏蔽了一部分不太安全的算法導致建立連接的時候驗證失敗…

C++ 14新特性個人總結

variable templates 變量模板。這個特性允許模板被用于定義變量,就像之前模板可以用于定義函數或類型一樣。變量模板為模板編程帶來了新的靈活性,特別是在定義泛化的常量和元編程時非常有用。 變量模板的基本語法 變量模板的聲明遵循以下基本語法&am…

解決Vue+Vite打包后Leaflet的marker圖標不顯示的問題

前言 用Leaflet寫關于WebGIS的開發,用Vite或者webpack打包,打包后會找不到圖標,如下所示。 直言的說,筆者去網上搜了搜,其實收到一個比較好是答案。網址如下。 (完美解決~)關于VueLeaflet添加…

eslint 與 prettier 的一些常見的配置項(很詳細)

目錄 1、eslint 常見配置項(語法規范) 2、 prettier 常見的配置項(格式規范) 代碼規范相關內容看小編的該文章,獲取對你有更好的幫助 vsCode代碼格式化(理解eslint、vetur、prettier,實現格式…

IDEA啟動報錯:Abnormal build process termination...

一、問題描述 因為項目需要,同時打開了兩個idea,突然發現一個啟動的時候報錯,有點莫名其妙,剛還好好的,為啥就不能用了,一頓百度找方法,試了各種方法,像重新安裝jdk、重啟系統發現都…

TensorFlow開源項目

歡迎來到 Papicatch的博客 文章目錄 🍉TensorFlow介紹 🍉主要特點和功能 🍈多語言支持 🍈靈活的架構 🍈分布式訓練 🍈跨平臺部署 🍈強大的工具鏈 🍈豐富的社區和生態系統 &a…

c++基本數據類型和計算(一)習題講解

1.【單選題】以下說法正確的是? A. unsigned 類型的值 最大為0xFFFFFFFF B. float類型的值大約有15位精度 C.bool類型占用4個字節 解析: 選項A:unsigned 類型的值 最大為 4個字節,正確。選項B: 因為float類型的值是單精度的浮…

Vue3基礎使用

目錄 一、創建Vue3工程 (一)、cli (二)、vite 二、常用Composition API (一)、setup函數 (二)、ref函數 (三)、reactive函數 (四)、setup注意事項 (五)、計算屬性 (六)、watch (七)、watchEffect函數 (八)、生命周期 1、以配置項的形式使用生命周期鉤子 2、組合式…

kafka-簡單代碼實現生產者消費者

生產者代碼: package com.kafka.test;import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.seriali…

【機器學習-10】 | Scikit-Learn工具包進階指南:Scikit-Learn工具包之支持向量機模塊研究

🎩 歡迎來到技術探索的奇幻世界👨?💻 📜 個人主頁:一倫明悅-CSDN博客 ?🏻 作者簡介: C軟件開發、Python機器學習愛好者 🗣? 互動與支持:💬評論 &…