mysql的悲觀鎖 mysql悲觀鎖

2021-10-18 23:44:22 字數 2016 閱讀 6152

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 privileges;

新建兩張表:

drop table if exists `goods`;

create table `goods` (

`id` int(11) not null auto_increment,

`name` varchar(255) default null,

`price` decimal(10,2) default null,

primary key (`id`)

) engine=innodb auto_increment=0 default charset=utf8;

-- table structure for goods_order_relation

drop table if exists `goods_order_relation`;

create table `goods_order_relation` (

`goodsid` int(11) default null,

`orderid` int(11) default null

) engine=innodb default charset=utf8;

悲觀鎖:

start transaction;//開啟事務,這會讓auto commit失效

select * from goods where id = 21 for update;//鎖定了id=21的資料,這個是行鎖,因為id有索引,(id是主鍵)

insert into goods(name,price) value('goo',123);

select sleep(10*1000);//事務延時提交

commit;

當事務等待的時候,由於沒有提交,任何修改id=21記錄的請求都會等待,包括update這條資料或者其他執行緒在執行相同的for update;

當不是通過索引來for update的時候:

start transaction;

select * from goods_order_relation where goodsid = 1 for update;//goodsid沒有索引

select sleep(20) from dual;

commit;

這個時候會進行表鎖,這張表將不能進行任何插入或者刪除修改等動作,為什麼for update會公升級到表鎖,是因為如果不進行表鎖,可能其他執行緒還在在增加一條資料goodsid = 1,所以只能公升級到表鎖,也就是行鎖鎖住的其實是索引中的該節點

如:start transaction;

select * from goods where name = 'goo' for update;

insert into goods(name,price) value('goo',123);

select sleep(10*1000);

commit;

由於name上沒有索引,這將導致鎖表

樂觀鎖:

mysql本身並不提供樂觀鎖的實現,需要程式設計師自己實現

實現的思路就是cas,通過乙個版本號的增加,當進行更新時判斷版本號,如果發現update修改條數為0,則認為修改失敗(所以update操作應該盡量返回int型別)。

當更新失敗時有兩種解決方式:鎖公升級,公升級到悲觀鎖後重複操作,或者可以通過自旋(while true)的方式多次嘗試來達到自適應

樂觀鎖的合理使用,可減少悲觀鎖帶來的效能開銷,其實並沒有真正加鎖。reentrantlock實現的就是樂觀鎖,aqs自旋,locksurport實現原子操作

一鍵複製

編輯web ide

原始資料

按行檢視

歷史

mysql悲觀鎖測試 測試乙個mysql 悲觀鎖

建立乙個儲存過程 在儲存過程中 先查詢 乙個表 for update 見 delimiter drop procedure if exists test sp1 create procedure test sp1 begin declare t error integer default 0 dec...

MySQL 悲觀鎖 樂觀鎖

悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發程式設計中乙個非常基礎的概念。本文將對這兩種常見的鎖機制在資料庫資料上的實現進行比較系統的介紹。悲觀鎖 pessimistic lock 悲觀鎖的特點是先獲取鎖,再進行業務操作,即 悲觀 的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進...

MySQL 悲觀鎖 樂觀鎖

悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發程式設計中乙個非常基礎的概念。本文將對這兩種常見的鎖機制在資料庫資料上的實現進行比較系統的介紹。悲觀鎖 pessimistic lock 悲觀鎖的特點是先獲取鎖,再進行業務操作,即 悲觀 的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進...