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操作成功!
作者:努力为明天
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!