MySQL-數據操作類型的角度理解 S鎖 X鎖

文章目錄

  • 1、S鎖和S鎖互相兼容
  • 2、S鎖和X鎖互斥
  • 3、X鎖和X鎖也互斥
  • 4、X鎖和S鎖也互斥
  • 5、select * from account for update;
  • 6、select * from account for update nowait;
  • 7、select * from account for update skip locked;

1、S鎖和S鎖互相兼容

在這里插入圖片描述

2、S鎖和X鎖互斥

在這里插入圖片描述

3、X鎖和X鎖也互斥

在這里插入圖片描述

4、X鎖和S鎖也互斥

在這里插入圖片描述

5、select * from account for update;

SELECT * FROM account FOR UPDATE; 是一個SQL語句,通常用于數據庫管理系統(如Oracle, PostgreSQL, MySQL的InnoDB存儲引擎等)中,用于鎖定所選的行以供后續更新。

以下是這條語句的詳細解釋:

  1. SELECT * FROM account

    • 這部分是一個標準的SELECT語句,用于從account表中檢索所有列和所有行。
  2. FOR UPDATE

    • 這是一個鎖定子句,用于鎖定所選的行。一旦這些行被鎖定,其他事務就不能修改或刪除它們,直到當前事務完成(提交或回滾)。
    • 這種鎖定機制通常用于確保數據的一致性,特別是在涉及多個步驟的復雜事務中。
    • 注意:不同的數據庫管理系統對FOR UPDATE的鎖定行為和范圍可能有不同的實現。例如,在某些系統中,它可能只鎖定所查詢的行(行級鎖定),而在其他系統中,它可能鎖定整個表(表級鎖定)。

使用場景

假設你有一個在線銀行系統,用戶A正在嘗試從他的賬戶中轉賬到用戶B的賬戶。為了確保轉賬過程中賬戶余額的一致性,你可能需要執行以下步驟:

  1. 使用SELECT * FROM account WHERE id = A's_account_id FOR UPDATE;鎖定用戶A的賬戶。
  2. 檢查用戶A的賬戶余額是否足夠進行轉賬。
  3. 如果余額足夠,從用戶A的賬戶中扣除相應金額,并增加用戶B的賬戶余額。
  4. 提交事務,釋放鎖。

通過這種方式,你可以確保在用戶A的賬戶被檢查和更新之間,沒有其他事務修改它,從而避免了潛在的數據不一致問題。

6、select * from account for update nowait;

SELECT * FROM account FOR UPDATE NOWAIT; 是一條SQL語句,通常用于數據庫中的事務處理,特別是在需要鎖定某些行以確保數據一致性的情況下。下面我會詳細解釋這條語句的每個部分:

  1. SELECT * FROM account

    • 這部分是一個標準的SELECT查詢,它從account表中選擇所有列(因為使用了*)。
  2. FOR UPDATE

    • FOR UPDATE是一個鎖定子句,用于在事務中鎖定選定的行。這意味著一旦某個事務執行了這個查詢并鎖定了某些行,其他嘗試修改這些行的事務將被阻塞,直到第一個事務提交或回滾。
    • 這種鎖定通常用于確保數據的完整性和一致性,尤其是在并發操作的環境中。
  3. NOWAIT

    • NOWAIT是一個與FOR UPDATE一起使用的選項。當指定了NOWAIT時,如果請求的行當前已被其他事務鎖定,那么查詢將立即返回一個錯誤,而不是等待其他事務釋放鎖。
    • 這對于不希望因為等待鎖而被阻塞的應用程序來說是非常有用的。通過立即得到一個錯誤,應用程序可以決定如何響應(例如,重試、報告錯誤給用戶等)。

示例場景

假設你有一個銀行應用程序,兩個用戶(A和B)同時嘗試從同一個賬戶(假設賬戶ID為123)中取款。為了避免出現“超支”的情況(即兩個用戶都成功取款,但賬戶余額不足以支付兩次取款),數據庫需要確保一次只有一個用戶能夠訪問和修改該賬戶。

  • 用戶A開始一個事務,并執行SELECT * FROM account WHERE id = 123 FOR UPDATE NOWAIT;。假設此時賬戶余額足夠支付用戶A的取款請求。
  • 在用戶A的事務完成之前(即提交或回滾之前),用戶B也嘗試執行相同的查詢。
  • 因為用戶A的事務已經鎖定了賬戶ID為123的行,并且由于使用了NOWAIT選項,所以用戶B的查詢將立即返回一個錯誤,而不是等待用戶A的事務完成。
  • 用戶B的應用程序可以捕獲這個錯誤,并決定如何響應(例如,告訴用戶B稍后再試)。

這樣,通過使用FOR UPDATE NOWAIT,你可以確保數據的一致性和完整性,同時減少因為等待鎖而導致的延遲和可能的死鎖情況。
在這里插入圖片描述

7、select * from account for update skip locked;

SELECT * FROM account FOR UPDATE SKIP LOCKED; 這條SQL語句在支持該語法的數據庫中(如Oracle、PostgreSQL等)用于在嘗試鎖定表或表中的行時跳過已經被其他事務鎖定的行。這允許查詢快速返回一個結果集,其中只包含當前事務可以立即鎖定的行,而忽略那些已被其他事務鎖定的行。

這條語句通常用于高并發的數據庫環境中,特別是當多個事務需要同時訪問并更新相同的資源時。通過使用SKIP LOCKED選項,可以避免一個事務長時間等待另一個事務釋放鎖,從而提高整個系統的吞吐量和響應速度。

以下是這條語句的一些關鍵點:

  1. SELECT * FROM account:選擇account表中的所有列。
  2. FOR UPDATE:指示數據庫鎖定所選的行,以便在后續的事務中更新它們。
  3. SKIP LOCKED:如果所選的行已被其他事務鎖定,則跳過這些行并繼續選擇其他未被鎖定的行。

示例場景

假設你有一個在線購物網站,并且多個用戶同時嘗試購買同一件商品(庫存有限)。為了確保商品不會被超賣,每次購買時都需要鎖定相應的庫存記錄并進行更新。

  • 用戶A開始一個事務,并嘗試鎖定庫存中數量大于0的商品。假設商品ID為123,當前庫存為1。
  • 在用戶A的事務完成之前(即提交或回滾之前),用戶B也嘗試購買同一件商品。
  • 由于用戶A已經鎖定了商品ID為123的記錄,所以用戶B的查詢(使用FOR UPDATE SKIP LOCKED)將跳過已被鎖定的記錄,并繼續查找其他未被鎖定的商品。
  • 如果此時沒有其他商品可購買,用戶B的事務將不會等待用戶A的事務完成,而是立即返回一個空的結果集或相應的錯誤消息。

通過使用FOR UPDATE SKIP LOCKED,你可以提高并發性能,避免不必要的等待,并為用戶提供更快的響應速度。然而,請注意,這種機制并不能完全解決并發沖突,特別是在高并發的環境中。你可能還需要結合其他技術(如樂觀鎖、重試機制等)來確保數據的一致性和完整性。
在這里插入圖片描述

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

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

相關文章

20240702 每日AI必讀資訊

🔍GPTPdf:使用類似GPT-4o的多模態LLM分析PDF文件 - 使用類似 GPT-4o 多模態模型解析 PDF 文件,轉換為 Markdown 格式。 - 代碼簡潔高效,僅293行。 - 解析結果幾乎完美包括排版、數學公式、表格、圖片、圖表等內容。 &#x1…

【記錄】IDEA2023的激活與安裝

前言: 記錄IDEA2023的激活與安裝 第一步:官網下載安裝包: 下載地址:https://www.jetbrains.com/idea/download/other.html 這個最好選擇2023版本,用著很nice。 安裝步驟就不詳解了,無腦下一步就可以了…

(四十七)Vue Router之路由守衛

文章目錄 概念全局路由守衛全局前置守衛全局解析守衛全局后置路由守衛 獨享路由守衛組件內的守衛beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave 完整的導航解析流程 上一篇:(四十六)Vue Router組件所獨有的兩個鉤子activate、deactivat…

VLAN原理與配置

AUTHOR :閆小雨 DATE:2024-04-28 目錄 VLAN的三種端口類型 VLAN原理 什么是VLAN 為什么使用VLAN VLAN的基本原理 VLAN標簽 VLAN標簽各字段含義如下: VLAN的劃分方式 VLAN的劃分包括如下5種方法: VLAN的接口鏈路類型 創建V…

Android system.img掛載和解除掛載

Android system.img掛載和解除掛載 解包后的super.img,里面最重要的是system.img文件,如何對system.img進行掛載和解除掛載是需要掌握的能力 基礎知識 system.img、vendor.img 都存在兩種格式raw,sparse ,在ubuntu命令窗口下執行下執行&am…

深度學習之生成對抗網絡 BigGAN

BigGAN(Big Generative Adversarial Networks)是生成對抗網絡(GAN)的一種變體,專注于生成高質量、大尺寸的圖像。BigGAN 是由 DeepMind 的研究人員于 2018 年提出的。其核心思想是通過增加模型的規模(更深的網絡和更多的參數)來提高生成圖像的質量,同時引入一些新的技術…

便簽 Pro(Mac 智能便簽工具)專業版怎么樣,值得購買嗎?

使用 Mac 的小伙伴平時都是怎么記錄工作生活中的碎片信息?用聊天軟件,還是系統備忘錄呢? 實際體驗下來,其實都難以稱得上好用。 趕緊來了解一下 Mac 多彩思維速記工具便簽 Pro!擁有智能邊框大小、iCloud 同步、歷史記…

矩陣置零解題

給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1: 輸入:matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 輸入&…

VUE3解決跨域問題

本文基于vue3 vite element-plus pnpm 報錯:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接訪問其他IP,需要用vite.config.ts &#xff0…

onvif 基本概念

media_server、device_server和event_server是三個重要的服務。 1. media_server 功能:media_server服務主要負責處理媒體流相關的請求,包括視頻和音頻流的傳輸、控制等。實現:該服務通常使用RTSP(Real Time Streaming Protocol…

API-本地存儲

學習目標: 掌握本地存儲 學習內容: 本地存儲介紹本地存儲分類存儲復雜數據類型 本地存儲介紹: 以前我們頁面寫的數據一刷新頁面就沒有了,是不是? 隨著互聯網的快速發展,基于網頁的應用越來越普遍,同時也…

算法基礎入門 - 2.棧、隊列、鏈表

文章目錄 算法基礎入門第二章 棧、隊列、鏈表2.1 隊列2.2 棧2.3 紙牌游戲2.4 鏈表如何建立鏈表?1.我們需要一個頭指針(head)指向鏈表的初始。鏈表還沒建立時頭指針head為空2.建立第一個結點3.設置剛創建的這個結點的數據域(左半)和指針域(右半)4.設置頭指針,頭指針可方便…

【鴻蒙學習筆記】運算符

官方文檔&#xff1a;ArkTS語言介紹 目錄標題 賦值運算符比較運算符一元運算符&#xff1a;自增自減運算符二元運算符位運算符邏輯運算符 賦值運算符 運算符解釋解釋賦值運算符x x y加-x x - y減*x x * y乘/x x / y除%x x % y取余<<x x << y按位左移>&…

問題-小技巧-專業版Win11怎么啟動電腦的休眠模式?

專業版Win11怎么啟動電腦的休眠模式&#xff1f; powercfg -a powercfg -hibernate on 啟用管理員面板依次輸入上述命令就可以了。

寵物醫院管理系統-計算機畢業設計源碼07221

目 錄 1 緒論 1.1 選題背景和意義 1.2國內外研究現狀 1.3論文結構與章節安排 2 寵物醫院管理系統系統分析 2.1 可行性分析 2.1.1技術可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統用例分…

【python爬蟲】總結反反爬的技巧

1. 當請求失敗時重復請求 def get_url(url):try:response requests.get(url, timeout10) # 超時設置為10秒except:for i in range(10): # 循環去請求網站response requests.get(url, proxiesproxies, timeout20)if response.status_code 200:breakreturn response2. 適當…

C++ 教程 - 09 多線程處理

文章目錄 thread標準庫pthread庫 thread標準庫 C 11 后添加了新的標準線程庫 std::thread 類&#xff0c;需引入頭文件<thread>聲明即創建線程對象&#xff0c;如 thread th1&#xff1b; 調用無參構造&#xff0c;生成一個空的線程對象&#xff1b;thread th(callable&…

VL31N BAPI:GN_DELIVERY_CREATE創建內向交貨單同時批次拆分

翻到之前寫的測試代碼&#xff0c;記錄一下&#xff0c;用于創建DN的同時就進行批次拆分&#xff0c;不需要再調用變更的BAPI再去修改一次。 REPORT ZTEST_VL31N_BATCH_SPLIT.DATA:GS_VBSK_I TYPE VBSK, "構造:販売伝票ヘッダINGS…

2023-2024華為ICT大賽中國區 實踐賽云賽道 全國總決賽 理論部分真題

Part 1 大數據模塊(3題)&#xff1a; 1、以下關于特征選擇中的互信息法描述中&#xff0c;理解正確的是哪些?(多選題) A.互信息法是從信息熵的角度分析特征和輸出值之間的關系評分 B.在Python工具的sklearn模塊中&#xff0c;可使用mutual_info_classif(分類)和mutual_info…

AI智能在Type-C領域的應用

隨著科技的飛速發展&#xff0c;Type-C接口憑借其卓越的性能和廣泛的應用場景&#xff0c;已成為現代電子設備中不可或缺的一部分。而AI智能技術的興起&#xff0c;為Type-C領域帶來了革命性的變革&#xff0c;推動了其功能的進一步完善和應用領域的拓展。本文將探討AI智能在Ty…