樂觀鎖大多是基於資料版本記錄機制實現,一般是給資料庫表增加乙個"version"字段。讀取資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。
比如下單操作:
查詢出商品資訊。
select
(quantity, version)
from t_goods
where id =
#
根據商品資訊生成訂單。
將商品數量減1。
update t_goods
set quantity = quantity -
1where id =
# and version = #
悲觀鎖依靠資料庫提供的鎖機制實現。mysql中的共享鎖和排它鎖都是悲觀鎖。資料庫的增刪改操作預設都會加排他鎖,而查詢不會加任何鎖。
共享鎖指的就是對於多個不同的事務,對於乙個資源共享同乙個鎖。對某一資源加共享鎖,自身可可讀該資源,其他人也可以讀該資源(也可以再加共享鎖,即共享鎖共享多個記憶體),但無法修改。要想修改就必須等所有共享鎖都釋放完之後。語法:select * from table lock in share mode;
。
比如:視窗1,在乙個未結束的事務中給一條資料加上共享鎖。
begin
;select
*from t_red_packet where id =
1lock
inshare
mode
;
視窗2,給同一條資料加上共享鎖,加鎖成功。
select
*from t_red_packet where id =
1lock
inshare
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 =
1for
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 =
1for
update
;
綜上,共享鎖就是大家一起來讀,一起來共享鎖,但誰都不要對鎖著的資料進行修改,排它鎖就是我自己就是想來修改,你們可以讀,但你們都不能到鎖,也不能對資料進行修改。
行鎖就是給一行資料進行加鎖。
表鎖就是對一張表進行加鎖。
MySQL的各種鎖
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖 因為不擔心資料被修改 但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫...
mysql 的各種鎖
一 樂觀鎖 optimistic lock 每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可...
MySQL的各種鎖
文章目錄 一 樂觀鎖 optimistic lock 二 悲觀鎖 pessimistic lock 三 共享鎖 share lock 四 排他鎖 exclusive lock 五 行鎖 六 表鎖 七 資料庫隔離級別的實現 1 read uncommitted 讀未提交的資料 2 read commi...