mysql中悲觀鎖的使用

2021-09-09 05:43:41 字數 1623 閱讀 4942

一、普通用法

場景舉例:

商品goods表中有乙個欄位status,status為1代表商品未被下單,status為2代表商品已經被下單,那麼我們對某個商品下單時必須確保該商品status為1。假設商品的id為1。如果不採用鎖,那麼操作方法如下:

/1.查詢出商品資訊

select status from t_goods where id=1;

//2.根據商品資訊生成訂單

insert into t_orders (id,goods_id) values (null,1);

//3.修改商品status為2

update t_goods set status=2;

當高併發訪問的情況下會出現問題,這就要用到鎖。

二、通過資料庫實現悲觀鎖

悲觀鎖的實現,往往依靠資料庫提供的鎖機制。使用悲觀鎖的原理:當我們在查詢出goods資訊後就把當前的資料鎖定,直到我們修改完畢後再解鎖。那麼在這個過程中,因為goods被鎖定了,就不會出現有第三者來對其進行修改了。

//使用悲觀鎖,首先要關閉mysql資料庫的自動提交屬性

set autocommit=0;  

//設定完autocommit後,我們就可以執行我們的正常業務了。具體如下:

//1.開始事務

start transaction;

//2.查詢出商品資訊

select status from t_goods where id=1 for update;

//3.根據商品資訊生成訂單

insert into t_orders (id,goods_id) values (null,1);

//4.修改商品status為2

update t_goods set status=2;

//5.提交事務

commit;

三、詳解資料庫鎖(行級鎖和表級鎖)

1.當使用select…for update會把資料給鎖住,mysql innodb預設row-level lock,所以只有「明確」地指定主鍵,mysql 才會執行row lock (只鎖住被選取的資料) ,否則mysql 將會執行table lock (將整個資料表單給鎖住)。

2.測試資料庫鎖

資料庫表t_goods,包括id,status,name三個字段,id為主鍵,資料庫中記錄如下:

(1)行級鎖(指定主鍵,並且有此資料,row lock)

(2)表級鎖(無主鍵、主鍵不明確,table lock)

//主鍵不明確,出現表級鎖

//除了主鍵外,使用索引也會影響資料庫的鎖定級別。

mysql的悲觀鎖 mysql悲觀鎖

1.create database lock test db 2.create user test 1 identified by 123456 3.grant all privileges on lock test db.to test 1 identified by 123456 4.flush...

悲觀鎖 mysql中的悲觀鎖與樂觀鎖的實現

a.悲觀鎖的特點是先獲取鎖,再進行業務操作,即悲觀的認為所有的操作均會導致併發安全問題,因此要先確保獲取鎖成功再進行業務操作。通常來講,在資料庫上的悲觀鎖需要資料庫本身提供支援,即通過常用的select for update操作來實現悲觀鎖,當資料庫執行select for update時會獲取被s...

mysql中悲觀鎖 mysql中的樂觀鎖和悲觀鎖

mysql的樂觀鎖 相對悲觀鎖而言,樂觀鎖假設資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會對資料的衝突與否進行檢測,如果發現衝突,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。一般來說,實現樂觀鎖的方法是在資料表中增加乙個version欄位,每當資料更新的時候這個字段執行加1操作...