1. 程式人生 > 資料庫 >MySQL對於各種鎖的概念理解

MySQL對於各種鎖的概念理解

樂觀鎖

樂觀鎖大多是基於資料版本記錄機制實現,一般是給資料庫表增加一個"version"欄位。讀取資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。

比如下單操作:

查詢出商品資訊。

select (quantity,version)
from t_goods
where id = #{id}

根據商品資訊生成訂單。

將商品數量減1。

update t_goods
set quantity = quantity - 1
where id = #{id} and version = #{version}

悲觀鎖

悲觀鎖依靠資料庫提供的鎖機制實現。MySQL中的共享鎖和排它鎖都是悲觀鎖。資料庫的增刪改操作預設都會加排他鎖,而查詢不會加任何鎖。

共享鎖(讀鎖)

共享鎖指的就是對於多個不同的事務,對於一個資源共享同一個鎖。對某一資源加共享鎖,自身可可讀該資源,其他人也可以讀該資源(也可以再加共享鎖,即共享鎖共享多個記憶體),但無法修改。要想修改就必須等所有共享鎖都釋放完之後。語法:select * from table lock in share mode;

比如:

視窗1,在一個未結束的事務中給一條資料加上共享鎖。

BEGIN;
SELECT * FROM t_red_packet WHERE id = 1 LOCK IN SHARE MODE;

視窗2,給同一條資料加上共享鎖,加鎖成功。

SELECT * FROM t_red_packet WHERE id = 1 LOCK IN SHARE MODE;

視窗1和視窗2,更新該行資料,提示[Err] 1205 - Lock wait timeout exceeded; try restarting transaction。需要等到所有共享鎖釋放,才可以進行update操作。

UPDATE t_red_packet
SET user_id = 2

排它鎖(寫鎖)

排它鎖指的就是對於多個不同的事務,對同一個資源只能有一把鎖。對某一資源加排它鎖,自身可以進行增刪改查,其他人無法進行加鎖操作,更無法進行增刪改操作。語法:select * from table for update

視窗1,在一個未結束的事務中給一條資料加上排它鎖。

BEGIN;
SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;

視窗1,更新該行資料,成功。

UPDATE t_red_packet
SET user_id = 2

視窗2,查詢該行資料,可以查詢到。

SELECT * FROM t_red_packet WHERE id = 1

視窗2給該條資料加鎖,提示[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;

綜上,共享鎖就是大家一起來讀,一起來共享鎖,但誰都不要對鎖著的資料進行修改,排它鎖就是我自己就是想來修改,你們可以讀,但你們都不能到鎖,也不能對資料進行修改。

行鎖

行鎖就是給一行資料進行加鎖。

表鎖

表鎖就是對一張表進行加鎖。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結