MySQL 樂觀鎖
樂觀鎖認為當前的情況是最好的情況,即每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料
drop table if exists supply_address;
-- 建立表
CREATE TABLE if not exists `supply_address` (
`id` int NOT NULL AUTO_INCREMENT,
`supply_no` int NOT NULL,
`loc_no` int NOT NULL,
`loc_name` varchar(192) DEFAULT NULL,
`create_by` int DEFAULT NULL,
`create_time` datetime(3) DEFAULT NULL,
`h_version` int DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
往資料庫插入1條記錄
insert into supply_address(supply_no, loc_no, loc_name, create_by, create_time, h_version)
SELECT 2098,1,'test1',-1,now(),1;
-- 得到id=1 的一條記錄
select * from supply_address;
現在有A,B兩個使用者同時修改id =1 的這條記錄的name
-- A操作
update supply_address set loc_name = 'test2' where id = 1;
-- B操作
update supply_address set loc_name = 'test1' where id = 1;
結果A 更新完發現loc_name變成test1???
使用樂觀鎖解決這種資料不一致問題,每個人更新都要帶上當前資料的版本號(h_version)
-- A操作
update supply_address set loc_name = 'test2', h_version = h_version + 1 where id = 1 and h_version = 1;
-- B操作
update supply_address set loc_name = 'test1', h_version = h_version + 1 where id = 1 and h_version = 1;
此時B操作失敗,由於B使用了舊的版本去更新資料,而A操作成功!