MySQL 乐观锁

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

posted @ 2024-06-16 15:52  crazy-zz5536  阅读(15)  评论(0编辑  收藏  举报