關于 UPDATE 語句 和 SELECT ... FOR UPDATE 的對比分析,包括語法、功能、鎖機制、使用場景及示例代碼

以下是關于 UPDATE 語句SELECT ... FOR UPDATE 的對比分析,包括語法、功能、鎖機制、使用場景及示例代碼:


1. UPDATE 語句

功能
  • 直接修改數據:立即更新表中的數據,并提交修改。
  • 無顯式鎖:雖然會自動加鎖(如行鎖或表鎖),但鎖在事務提交或回滾時自動釋放。
語法
UPDATE table_name 
SET column1 = value1, column2 = value2, ...
WHERE condition;
示例代碼
-- 更新用戶 Alice 的年齡為 30
UPDATE users 
SET age = 30 
WHERE name = 'Alice';
特性
  1. 立即生效:修改數據后直接生效(除非在事務中未提交)。
  2. 自動提交:若未在事務中,UPDATE 會自動提交(取決于 autocommit 設置)。
  3. 鎖機制
    • 更新時會鎖定涉及的行(默認為行鎖),防止其他事務同時修改同一行。
    • 鎖在事務提交(COMMIT)或回滾(ROLLBACK)時釋放。

2. SELECT … FOR UPDATE

功能
  • 選擇并鎖定數據:選擇數據的同時加鎖,防止其他事務修改或讀取鎖定的行(取決于隔離級別)。
  • 需配合事務:必須在事務中使用,否則鎖會立即釋放。
語法
START TRANSACTION;
SELECT * FROM table_name 
WHERE condition 
FOR UPDATE;
COMMIT;
示例代碼
-- 開始事務
START TRANSACTION;-- 鎖定用戶 Alice 的記錄
SELECT * FROM users 
WHERE name = 'Alice' 
FOR UPDATE;-- 后續操作(如更新)
UPDATE users SET age = 30 WHERE name = 'Alice';-- 提交事務
COMMIT;
特性
  1. 僅鎖定數據:不直接修改數據,需結合 UPDATE 使用。
  2. 顯式事務:必須在事務中使用,鎖在事務提交或回滾后釋放。
  3. 鎖機制
    • 鎖定符合條件的行,阻止其他事務的 UPDATEDELETESELECT FOR UPDATE 操作。
    • 其他事務的 SELECT(非 FOR UPDATE)可能讀取到鎖定行(取決于隔離級別)。

3. 對比表格

特性UPDATESELECT … FOR UPDATE
主要功能直接修改數據鎖定數據,防止其他事務修改
是否需要事務可選(自動提交或事務中)必須在事務中
鎖機制自動加鎖,事務提交后釋放顯式加鎖,事務提交/回滾后釋放
數據修改直接修改數據僅鎖定數據,需后續 UPDATE 操作
適用場景簡單更新,無需復雜業務邏輯需保證數據一致性(如扣庫存、秒殺)
性能影響鎖定時間短(僅執行期間)鎖定時間長(整個事務期間)
并發問題可能導致臟讀或不可重復讀(高并發)通過鎖避免并發問題,但可能導致死鎖

4. 典型場景對比

場景 1:簡單更新
-- 直接使用 UPDATE
UPDATE users SET age = 30 WHERE name = 'Alice';
場景 2:需要事務保證的更新
-- 使用 SELECT FOR UPDATE + UPDATE
START TRANSACTION;
SELECT * FROM users WHERE name = 'Alice' FOR UPDATE;
-- 驗證業務邏輯(如檢查余額)
UPDATE users SET age = 30 WHERE name = 'Alice';
COMMIT;

5. 關鍵注意事項

  1. 死鎖風險
    • 使用 SELECT FOR UPDATE 時,若多個事務相互等待鎖,可能導致死鎖。需通過合理鎖順序或超時機制避免。
  2. 隔離級別影響
    • READ COMMITTED 隔離級別下,其他事務的 SELECT 可讀取鎖定行的最新提交數據。
  3. 性能優化
    • 避免長時間持有鎖(如在事務中執行耗時操作)。
    • 盡量縮小 SELECT FOR UPDATE 的范圍(如通過精確 WHERE 條件)。

6. 總結

場景推薦使用原因
簡單數據更新UPDATE直接高效,無需復雜事務控制。
需要事務一致性(如扣庫存)SELECT FOR UPDATE + UPDATE確保在事務中鎖定數據,避免并發修改導致的邏輯錯誤。
高并發寫操作SELECT FOR UPDATE通過顯式鎖控制并發,但需謹慎處理鎖競爭和死鎖。

通過合理選擇 UPDATESELECT FOR UPDATE,可以平衡數據一致性和性能需求,避免并發問題。

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

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

相關文章

在航電系統中提高可靠性的嵌入式軟件設計

1.總線余度設計 數據傳輸采用雙余度總線設計,CANFD為主,RS485為備。發送方將相同的數據分別通過雙總線來發送,接收方優先處理主線數據。由于總線上數據頻率固定,可設置定時器監控主總線的數據,當定時器超時后&#xff…

第十五屆藍橋杯大賽軟件賽省賽Python 大學 C 組:5.回文數組

題目1 回文數組 小藍在無聊時隨機生成了一個長度為 n 的整數數組,數組中的第 i 個數為 ai,他覺得隨機生成的數組不太美觀,想把它變成回文數組,也是就對于任意 i∈[1,n] 滿足 a i a n ? i 1 a_ia_{n?i}1 ai?an?i?1。 小藍…

netty中的WorkerGroup使用詳解

Netty中WorkerGroup的深度解析 WorkerGroup是Netty線程模型中的從Reactor線程組,負責處理已建立連接的I/O讀寫、編解碼及業務邏輯執行。其設計基于主從多Reactor模型,與BossGroup分工協作,共同實現高并發網絡通信的高效處理。 一、WorkerGro…

模運算核心性質與算法應用:從數學原理到編程實踐

目錄 🚀前言🌟數學性質:模運算的理論基石💯基本定義:余數的本質💯四則運算規則:保持同余性的關鍵 🦜編程實踐:模運算的工程化技巧💯避免數值溢出:…

#Git 變基(Rebase)案例

適合學習理解的 Git 變基(Rebase)案例 為了幫助你更好地理解 Git 變基(Rebase)的操作和效果,下面通過一個簡單的案例來演示變基的過程和影響。 案例背景 假設我們有一個 Git 倉庫,包含兩個分支&#xff1…

泰博云平臺solr接口存在SSRF漏洞

免責聲明:本號提供的網絡安全信息僅供參考,不構成專業建議。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我聯系,我將盡快處理并刪除相關內容。 漏洞描述 SSRF漏洞是一種在未能獲取服務器…

MyBatis 動態SQL 詳解!

目錄 一、 什么是動態 SQL?二、 為什么需要動態 SQL?三、 MyBatis 動態 SQL 標簽四、 標簽詳解及示例1、 if 標簽2、 choose、when、otherwise 標簽3、 where 標簽4、 set 標簽5、 foreach 標簽6、 sql、include 標簽 五、 總結 🌟我的其他文…

阿里云服務器遭遇DDoS攻擊有爭議?

近年來,阿里云服務器頻繁遭遇DDoS攻擊的事件引發廣泛爭議。一方面,用戶質疑其防御能力不足,導致服務中斷甚至被迫進入“黑洞”(清洗攻擊流量的隔離機制),輕則中斷半小時,重則長達24小時&#xf…

如何在Springboot的Mapper中輕松添加新的SQL語句呀?

在如今的軟件開發界,Spring Boot可是非常受歡迎的框架哦,尤其是在微服務和RESTful API的構建上,真的是讓人愛不釋手!今天,我們就來聊聊如何為Spring Boot項目中的Mapper添加新的SQL語句吧!說起來&#xff0…

Qt 中 findChild和findChildren綁定自定義控件

在 Qt 中,findChild 和 findChildren 是兩個非常實用的方法,用于在對象樹中查找特定類型的子對象。這兩個方法是 QObject 類的成員函數,因此所有繼承自 QObject 的類都可以使用它們。當您需要查找并綁定自定義控件時,可以按照以下…

leecode第19天

15、三數之和 # 給你一個整數數組 nums ,判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k , # 同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。 # 注意:答案中不可以包含重復…

2109. 向字符串添加空格

2109. 向字符串添加空格 題目鏈接&#xff1a;2109. 向字符串添加空格 代碼如下&#xff1a; class Solution { public:string addSpaces(string s, vector<int>& spaces) {string res "";int j 0;//直接遍歷即可for (int i 0;i < spaces.size();i…

Java Spring Boot 與前端結合打造圖書管理系統:技術剖析與實現

目錄 運行展示引言系統整體架構后端技術實現后端代碼文件前端代碼文件1. 項目啟動與配置2. 實體類設計3. 控制器設計4. 異常處理 前端技術實現1. 頁面布局與樣式2. 交互邏輯 系統功能亮點1. 分頁功能2. 搜索與篩選功能3. 圖書操作功能 總結 運行展示 引言 本文將詳細剖析一個基…

CSRF跨站請求偽造——入門篇【DVWA靶場low級別writeup】

CSRF跨站請求偽造——入門篇 0. 前言1. 什么是CSRF2. 一次完整的CSRF攻擊 0. 前言 本文將帶你實現一次完整的CSRF攻擊&#xff0c;內容較為基礎。需要你掌握的基礎知識有&#xff1a; 了解cookie&#xff1b;已經安裝了DVWA的靶場環境&#xff08;本地的或云的&#xff09;&am…

BT-Basic函數之首字母R

BT-Basic函數之首字母R 文章目錄 BT-Basic函數之首字母Rrandomizercallremoterenamereportreport clearreport fault syndromereport isreport level isreport outreport usingre?savere?storereturnrevision$rexitrinitrli$rndrotaterpmcrpsrun randomize 以下是這段英文的…

CentOS 7 如何掛載ntfs的移動硬盤

CentOS 7 如何掛載ntfs的移動硬盤 前言一、查看硬盤并嘗試掛載(提示無法掛載)二、yum安裝epel-release提示yum被鎖定三、強行終止yum的進程四、yum安裝epel-release完成五、yum安裝ntfs-3g六、此時可正常掛載NTFS硬盤 前言 CentOS 7默認情況下是不支持NTFS的文件系統&#xff…

面試常考簡單操作

參考文章 面試常考簡單操作 快速排序歸并排序Dijkstra自定義排序交替打印奇偶數冒泡排序插入排序堆排序歐幾里得算法求最大公約數單例模式的雙重校驗LRU 快速排序 public class Solution {private static int partition(int[] arr, int left, int right) {int temp arr[left]…

2025圖像處理和深度學習國際學術會議(IPDL 2025)

重要信息 官網&#xff1a;www.IPDL.xyz 時間&#xff1a;2025年4月11-13日 地點&#xff1a;中國-成都 簡介 隨著深度學習和圖像處理技術的迅速發展&#xff0c;相關技術的應用逐漸滲透到各個行業&#xff0c;如醫療影像分析、自動駕駛、安防監控和智能制造等。這些應用的…

RNN萬能逼近定理證明

RNN萬能逼近定理證明 RNN原理圖和數學表達式RNN的萬能逼近定理及其證明證明 RNN原理圖和數學表達式 s t U h t ? 1 W x t b ∈ R D h s_tUh_{t-1}Wx_tb\in\mathbb{R}^{D_h} st?Uht?1?Wxt?b∈RDh? s t ∈ R D h s_t\in\mathbb{R}^{D_h} st?∈RDh? U ∈ R D h D h U\…

算力重構營銷生態:廣電數字人 “造星“ 運動背后的智能革命

一、數字人 "造星" 運動&#xff1a;廣電行業的智能覺醒 當陜西廣電的虛擬主播 "小雅" 在柞水縣融媒體中心實現日更 100 秒新聞&#xff0c;當湖北廣電的 "王丹" 從新聞主播轉型為城市文化 IP&#xff0c;一場由算力驅動的數字人 "造星&qu…