【SQL】InnoDB中的行鎖

InnoDB 里的行鎖機制主要通過索引來實現,而不是直接對表中的記錄加鎖。具體來說,InnoDB 使用以下幾種鎖定機制來實現行鎖:

  1. 記錄鎖 (Record Lock):鎖定單個索引記錄。
  2. 間隙鎖 (Gap Lock):鎖定索引記錄之間的間隙,防止其他事務在該間隙插入新記錄。
  3. 臨鍵鎖 (Next-Key Lock):結合記錄鎖和間隙鎖,鎖定一個索引記錄以及其前面的間隙。

行鎖的實現

InnoDB 的行鎖是通過對索引項加鎖來實現的,這意味著只有通過索引訪問數據,InnoDB 才能使用行級鎖定。如果一個 SQL 語句不使用索引,InnoDB 會退化為表鎖。

鎖的類型

  • 共享鎖 (S 鎖):允許事務讀取一條記錄,但不允許修改。
  • 排他鎖 (X 鎖):不允許其他事務讀取或修改一條記錄。

示例

假設有一個 employees 表:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary DECIMAL(10, 2)
) ENGINE=InnoDB;
使用 FOR UPDATE 加鎖
BEGIN;
SELECT * FROM employees WHERE id = 1 FOR UPDATE;

該語句在 id = 1 的記錄上加了一個排他鎖 (X 鎖)。由于 id 是主鍵,這是一個記錄鎖。

插入操作導致的間隙鎖
BEGIN;
INSERT INTO employees (id, name, salary) VALUES (5, 'Alice', 5000);

插入操作會導致在相應索引上的間隙鎖,以防止其他事務在相同間隙中插入記錄。

使用共享鎖
BEGIN;
SELECT * FROM employees WHERE salary > 4000 LOCK IN SHARE MODE;

該語句在符合條件的記錄上加了共享鎖 (S 鎖),同時會在表上加意向共享鎖 (IS 鎖)。

Java 代碼示例

假設你想通過 Java 代碼來執行這些操作,可以使用 JDBC:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class InnoDBLockExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/yourdatabase";String user = "yourusername";String password = "yourpassword";try (Connection conn = DriverManager.getConnection(url, user, password)) {// 開始事務conn.setAutoCommit(false);// 加鎖查詢String query = "SELECT * FROM employees WHERE id = ? FOR UPDATE";try (PreparedStatement pstmt = conn.prepareStatement(query)) {pstmt.setInt(1, 1);try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));}}}// 提交事務conn.commit();} catch (SQLException e) {e.printStackTrace();}}
}

該 Java 代碼示例演示了如何使用 JDBC 來執行一個帶有行鎖的查詢。首先,設置連接為手動提交模式,然后執行一個帶有 FOR UPDATE 的查詢以加鎖。最后,提交事務。

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

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

相關文章

vue 自定義(hook)--(模塊化)

文章目錄 定義示例代碼 定義 什么是hook?—— 本質是一個函數,把setup函數中使用的Composition API進行了封裝,類似于vue2.x中的mixin。 自定義hook的優勢:復用代碼, 讓setup中的邏輯更清楚易懂。 示例代碼 useSum.ts中內容如下…

react學習——26redux實現求和案例(異步action)

1、安裝redux-thunk npm install redux-thunk npm install redux-thunk2、redux/store.js 引入redux-thunk /*該文件專門用于創建一個為Count組件服務的store對象*/ //引入createStore,專門創建redux中最為核心的store對象 import {createStore,applyMiddleware} from redux …

Python:引號應用、字符串應用

# 把前面的引號理解為起始符,后面的理解為終止符 # 單雙引號的靈活運用 想輸出"hello,Q" 用單引號 # 想輸出 This is Qs 用雙引號 # 想輸出既有單引號又有雙引號或者特定格式 用三對單引號### word "hello,Q" word2 "This is Qs" …

mavlink協議解析

1. mavlink數據包格式 字節索引C 版本內容值說明0uint8_t magic數據包啟動標記0xFE特定于協議的文本啟動 (stx) 標記, 用于指示新數據包的開始。 任何不識別協議版本的系統都將跳過數據包。1uint8_t len載荷長度0 - 255指示以下 payload 部分的長度 (為特定消息固定)。2uint8_t…

java并發編程概述

java并發編程概述 一. 進程和線程的概念 進程是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配的基本單位。進程是程序運行的實例,每當操作系統在運行一個程序時,會為其創建一個進程。每個進程都擁有自己的一整套變量。…

python:openpyxl DataBarRule 制作數據條

技術文檔: 條件格式 — openpyxl 3.0.7 文檔 openpyxl.formatting.rule module — openpyxl 3.1.3 documentation 但是,想讓單元格數值按比例顯示(右邊正確)只能按data_bar_rule_2編寫: from openpyxl import Workb…

微服務中的 “客戶端負載均衡” 簡介

微服務中的客戶端負載均衡是指將負載(即工作任務或訪問請求)在客戶端進行分配,以決定由哪個服務實例來處理這些請求。這種負載均衡方式與服務端負載均衡相對,后者是在服務端(如服務器或負載均衡器)進行請求…

系統設計題-路由表最長匹配

一、題目 路由表最長匹配:將目標IP地址dstIP與路由為entryIP/掩碼長度m(比如10.166.50.0/23)進行匹配,找出匹配掩碼m最長值。 匹配規則: 如果dstIP和entryIP的二進制表示的前m個位相同,則說明是匹配的。 0…

抖音必備工具!掌握螢瓴優選櫥窗帶貨軟件的五大優勢,助你快速盈利

在當今數字化時代,抖音作為一款備受歡迎的短視頻社交平臺,不僅為人們提供了展示自我的舞臺,更成為了眾多商家和個人創業者推廣產品和服務的重要渠道。然而,要在抖音上實現高效帶貨,并非易事。幸運的是,螢瓴…

技校專業群的生成機制研究

一、引言 隨著我國經濟的快速發展和產業結構的不斷優化,技術型人才的需求日益旺盛。技工學校(簡稱技校)作為培養技術型人才的搖籃,其專業群的構建與發展顯得尤為重要。專業群作為技校戰略發展的核心,不僅能夠優化教學…

Python 腳本編寫指南:從框架到實踐

一、引言 Python 作為一種強大且易于學習的編程語言,在各個領域都有著廣泛的應用。編寫 Python 腳本是實現各種功能和任務的常見方式。 二、Python 腳本框架的基本組成部分 導入必要的模塊 在腳本的開頭,我們通常需要導入所需的 Python 模塊&#xff…

大模型之戰進入新賽季,開始卷應用

最近一段時間,國產大模型Kimi徹底火了,而這波爆火,某種意義上也展示了一個問題,即大模型的落地場景可能比技術比拼,更重要。 國產大模型Kimi突然爆火,與Kimi相關的產業鏈甚至被冠上“Kimi概念股”之名&…

【初階數據結構】樹與二叉樹:從零開始的奇幻之旅

初階數據結構相關知識點可以通過點擊以下鏈接進行學習一起加油!時間與空間復雜度的深度剖析深入解析順序表:探索底層邏輯深入解析單鏈表:探索底層邏輯深入解析帶頭雙向循環鏈表:探索底層邏輯深入解析棧:探索底層邏輯深入解析隊列:探索底層邏輯深入解析循環隊列:探索…

day10:03 一文搞懂encode和encoding的區別

在Python中,處理字符串時經常會遇到encode()方法和encoding參數,它們都與字符串的編碼和解碼有關,但用途和上下文有所不同。下面通過案例來解釋它們的關系和區別。 1. encode() 方法 encode()方法是字符串(str)類型的…

《簡歷寶典》08 - 簡歷中“教育背景”模塊如何揚長避短

目錄 1 本文概述 2 必須寫的信息 3 學歷的優勢凸顯 4 專業的重要性 5 如果所學專業與當前求職的職位不匹配 6 在校期間獲得的獎項和證書 7 最后 1 本文概述 前兩節我們把個人信息模塊做了拆分講解,分為必寫的信息項和根據個人情況酌情添加的信息項&#xff0…

51單片機:如何使用串口波特率計算器及其詳解

目錄 一、如何使用串口波特率計算器 1.以此為例: 2.生成代碼如下: 3.需要手動配置中斷系統 1.原理圖 2.配置代碼 二、如何理解軟件生成的波特率 1.以該代碼為例子進行分析 2.串口模式圖 三、如何計算波特率 參考STC89C52手冊P235 四、如何調用串口中斷函數 一、如何…

HBase 在統一內容平臺業務的優化實踐

作者:來自 vivo 互聯網服務器團隊-Leng Jianyu、Huang Haitao HBase是一款開源高可靠性、擴展性、高性能和靈活性的分布式非關系型數據庫,本文圍繞數據庫選型以及使用HBase的痛點展開,從四個方面對HBase的使用進行優化,取得了一些…

36. Adam 算法詳解

Adam(Adaptive Moment Estimation)是一種結合動量法和自適應學習率的優化算法,自2014年提出以來,迅速成為深度學習中最流行和常用的優化算法之一。Adam算法的核心思想是利用梯度的一階動量和二階動量來動態調整學習率,…

基于jeecgboot-vue3的Flowable流程-集成仿釘釘流程(五)仿釘釘流程的json數據保存與顯示

因為這個項目license問題無法開源,更多技術支持與服務請加入我的知識星球。 1、需要做一個界面保存與顯示仿釘釘的流程,先建一個表,用online建 2、通過上面生成代碼,放入到相應的前后端工程里 3、修改前端仿釘釘流程的設計功能&a…

spark基于Spark的對招聘信息的分析與設計-計算機畢業設計源碼50716

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2 系統分析 2.1 可行性分析 2.2.1 數據新增流程 2.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設計 3.1 系統架構設…