MySQL 樂觀鎖

crazy-zz5536發表於2024-06-16

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操作成功!

相關文章