MySQL:鎖

按粒度分類

全局鎖

  • 含義:全局鎖會鎖定整個數據庫實例,在其生效期間,其他事務無法對數據庫進行任何讀寫操作。常用于數據遷移、數據備份場景。

表級鎖

  • 表鎖:是對整張表進行鎖定的機制。實現邏輯簡單,加鎖和釋放鎖速度快,系統負面影響小,能有效避免死鎖問題。不過,因其鎖定粒度大,鎖定資源爭用概率高,會降低并發度。MyISAM、MEMORY、CSV 等非事務性存儲引擎主要使用表級鎖定。
  • 意向鎖:屬于表級鎖,目的是實現多粒度鎖機制,允許行鎖和表鎖共存。分為意向共享鎖(IS)和意向排他鎖(IX) 。意向共享鎖表明事務后續想獲取表中某些行的共享鎖;意向排他鎖則表示事務后續想獲取表中某些行的排他鎖。意向鎖可快速判斷表中是否已有記錄被加鎖,提升加鎖效率。
  • 元數據鎖:在執行 DML(增刪改查)或 DDL(結構變更)操作時,數據庫會自動添加。用于保護數據庫對象(如表、視圖等)的元數據信息,防止在操作過程中,元數據被其他事務修改,保證數據結構的一致性和穩定性。

行級鎖

  • 記錄鎖:鎖定單個數據記錄。InnoDB 存儲引擎中,若表建立時未設置索引,會使用隱式主鍵進行鎖定。
  • 間隙鎖:鎖定索引記錄之間的 “間隙”,防止其他事務在該間隙插入數據。

image.png

  • 臨鍵鎖:是記錄鎖和間隙鎖的組合,既鎖定當前行,又鎖定該行之后的間隙。
  • 插入意向鎖:事務在插入數據時會獲取,用于表示插入意向。它與其他事務的插入意向鎖兼容,不同事務可并發插入數據到同一索引區間,提高插入操作的并發性能。

按行為分類

共享鎖

SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;
  • 含義:也叫讀鎖,允許事務讀取數據,但不允許修改。多個事務可同時獲取共享鎖。
  • 應用場景:適用于多個事務同時讀取同一數據的場景,如報表生成、數據統計等操作,多個事務可同時加共享鎖讀取數據,互不干擾。

排他鎖

SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
  • 含義:又稱寫鎖,只允許一個事務對特定數據進行讀寫操作,其他事務無法對該數據加任何類型的鎖。
  • 應用場景:用于數據修改操作,如插入、更新、刪除等。在進行這些操作前,需先加排他鎖,防止其他事務同時修改數據,保證數據修改的原子性和一致性。

按模式分類

悲觀鎖

  • 策略:一種假設并發沖突總會發生的策略,每次在訪問數據前,都會對數據加鎖,包括共享鎖、排他鎖等。
  • 應用場景:在并發沖突概率較高,或對數據一致性要求極高的場景中適用。例如在金融交易系統中,資金轉賬操作需確保數據準確一致,常使用悲觀鎖防止并發問題。

樂觀鎖

  • 策略:假設并發沖突不會發生,不主動加鎖。通常通過版本號或時間戳字段實現。在更新數據時,先比較版本號或時間戳,若數據未被其他事務修改,才進行更新操作。
  • 應用場景:適用于并發沖突概率較低的場景,能減少鎖的開銷,提高系統并發性能。如一些讀操作頻繁,寫操作相對較少且沖突概率低的系統中可使用。

避免死鎖

  1. 確保事務訪問數據順序一致:在多個事務并發訪問數據時,通過合理加鎖,確保事務按特定順序訪問數據,避免因并發操作導致數據不一致。
  2. 合理使用索引:建立合適索引,能讓查詢更精準,減少鎖的范圍,避免因索引不當導致鎖升級為表鎖,進而降低死鎖風險
  3. 控制事務大小:使用較小事務,減少事務執行時間和鎖持有時間,降低多個事務互相等待鎖的可能性,從而避免死鎖。
    . 控制事務大小:使用較小事務,減少事務執行時間和鎖持有時間,降低多個事務互相等待鎖的可能性,從而避免死鎖。
  4. 設置鎖等待超時時間:通過設置合理的鎖等待超時時間,當事務等待鎖時間超過該值時自動回滾,打破死鎖循環,防止因死鎖導致系統長時間無法運行。在 MySQL 中,可通過相關參數配置來設置鎖等待超時時間。

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

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

相關文章

數字政府政務服務領域智能化應用解決方案

數字政府政務服務領域智能化應用 解決方案 一、方案背景 在數字經濟蓬勃發展的當下,數字化轉型已成為政府提升治理能力、優化公共服務、增強競爭力的關鍵路徑。黨的十九屆四中全會明確提出 “推進數字政府建設”,這為政府的數字化轉型指明了方向。 隨…

03--Deepseek服務器部署與cjson解析

一、ollama部署deepseek模型 1、Ollama 是一個開源的本地大語言模型運行框架,專為在本地機器上便捷部署和運行大型語言模型(LLM)而設計。 Ollama 教程:從 0 到 1 全面指南 教程【全文兩萬字保姆級詳細講解】 -CSDN博客 1.下載o…

棧(算法)

在 C 里,棧是一種遵循后進先出(LIFO)原則的數據結構。下面從多個方面為你介紹 C 棧: 1. 使用標準庫中的std::stack C 標準庫提供了std::stack容器適配器,能方便地實現棧的功能。以下是簡單示例: cpp #in…

UniApp 頁面布局自定義頭部導航

動態計算頭部高度與內容偏移量:實現 UniApp 頁面布局的精準適配 在移動端應用開發中,頁面布局的精準適配是一個關鍵問題。尤其是在 UniApp 中,不同設備的屏幕尺寸、狀態欄高度以及頭部布局的差異,可能導致頁面內容錯位或顯示不全…

verilog學習--1、語言要素

先看一個例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B; endmodule; Verilog以module為單位編寫,每個文件一個module&#…

AC 自動機 洛谷P3808 P3796 P5357

洛谷P3808 #include <bits/stdc.h> using namespace std; const int maxn 1e6 5; int ch[maxn][30], fa[maxn], End[maxn]; int cnt 0 , n; int get_num(char c){return c - a;} void build(string s){int cur 0, len s.length();for(int i 0; i < len; i){int…

C++藍橋杯實訓篇(二)

片頭 嗨咯~小伙伴們&#xff01;今天我們來一起學習算法和貪心思維&#xff0c;準備好了嗎&#xff1f;咱們開始咯&#xff01; 第1題 數位排序 對于這道題&#xff0c;我們需要自己寫一個排序算法&#xff0c;也就是自定義排序&#xff0c;按照數位從小到大進行排序。 舉一…

redisson常用加鎖方式

RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);這兩種加鎖方式的區別如下&…

Go 微服務框架 | 路由實現

文章目錄 不用框架實現web接口實現簡單的路由實現分組路由支持不同的請求方式支持同一個路徑的不同請求方式前綴樹應用前綴樹完善路由代碼 不用框架實現web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

zabbix中通過模板實現自動發現對tcp端口批量監控

主要為了解決監控大量端口&#xff0c;避免繁瑣的重復操作監控項和觸發器 諸位~ 僅供參考哈 自動發現監控參考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先創建一個模板 自定義名稱和群組 創建自動發現規則 模板——自動發現——創建發現規則…

Mysql備忘記錄

1、簡介 Mysql操作經常忘記命令&#xff0c;本文將持續記錄Mysql一些常用操作。 2、常見問題 2.1、忘記密碼 # 1、首先停止Mysql服務 systemctl stop mysqld # windows 從任務管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

【藍橋杯】15屆JAVA研究生組F回文字符串

一、思路 1.這題去年考的時候想的是使用全排列進行嘗試&#xff0c;實際不用這么麻煩&#xff0c;只用找到第一個和最后一個非特殊字符串的位置&#xff0c;然后分別向內檢查是否對稱&#xff0c;向外檢查是否對稱直到左指針小于0(可以通過添加使其對稱) 2.至于如何找到第一個…

X 進制減法

題目鏈接&#xff1a; 思路&#xff1a; X進制數321怎么轉換為十進制數為65&#xff1f;如下圖&#xff1a; ①題目要求我們求 A - B 的最小值&#xff0c;對第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;當進制越小的時候差值越小&#xff0c;但進制要比 max&…

java線程安全-單例模式-線程通信

首先看看單例模式的寫法 首先我們先來回顧一下餓漢式單例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

大數據技術之SPARK

Spark Core 什么是 RDD 代碼中是一個抽象類&#xff0c;它代表一個彈性的、不可變、可分區、里面的元素可并行計算的集合 彈性 存儲的彈性&#xff1a;內存與磁盤的自動切換&#xff1b; 容錯的彈性&#xff1a;數據丟失可以自動恢復&#xff1b; 計算的彈性&#xff1a;…

Go 語言范圍 (Range)

Go 語言范圍 (Range) Go 語言是一種靜態強類型、編譯型、并發型編程語言&#xff0c;由 Google 開發。它的簡潔性和高效性使其成為眾多開發者的首選。在 Go 語言中&#xff0c;range 是一個非常有用的關鍵字&#xff0c;用于遍歷數組、切片、字符串以及通道&#xff08;channe…

VUE中數據綁定之OptionAPI

<template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…

react動態路由

框架的權限控制&#xff08;在config.ts中配置&#xff09; export default {access: {}, }; 權限配置文件&#xff08;access.ts&#xff09; 新建 src/access.ts &#xff0c;在該文件中 export default 一個函數&#xff0c;定義用戶擁有的權限 該文件需要返回一個 functi…

Android里面如何優化xml布局

在 Android 開發中&#xff0c;以下是系統化的優化方案&#xff0c;從基礎到高級分層解析&#xff1a; 一、基礎優化策略 1. 減少布局層級 問題&#xff1a;每增加一層布局&#xff0c;測量/布局時間增加 1-2ms 解決方案&#xff1a; <!-- 避免嵌套 --> <LinearLayo…

基于STM32、HAL庫的IP6525S快充協議芯片簡介及驅動程序設計

一、簡介: IP6525S是一款高性能的同步降壓DC-DC轉換器芯片,具有以下特點: 輸入電壓范圍:4.5V至32V 輸出電壓范圍:0.8V至30V 最大輸出電流:5A 效率高達95% 可編程開關頻率(100kHz-1MHz) 支持PWM和PFM模式 內置過流保護、過溫保護等功能 該芯片常用于工業控制、通信設備…