数据库 悲观锁、乐观锁机制原理--结合应用场景

结合公司目前业务场景来理解悲观锁、乐观锁的机制原理——抢单功能实现:查询xx订单是否有人领取,未领取则更新领取人

悲观锁实现

采用数据库事务机制,将查询和更新xx订单作为一个事务进行加锁,更新完成后,其他事务才可操作xx订单

//sql代码简单演示(查询、更新作为一个事务处理)
declare
	oper := '';
begin
	select oper_no into oper from order where id = xxx;
	if oper = '' then
		update order set oper='lin' where id = xxx;
		commit;
	end if;
end;

乐观锁实现

在order表中增加了版本号(乐观锁)字段 version,先查询版本号old_version,判断新版本号是否与旧版本号相同,根据结果进行更新领取人操作

//程序实现(查询、更新为两个事务,互不影响)
string sql = "select version from order where id = xxx";
int old_version = query(sql);
sql = "update order set oper = 'lin' where version=" + old_version;
execute(sql);

结论

假设高并发业务场景,有1000个人同时抢单,悲观锁机制,抢单(查询、更新)完后,其他人才可抢单(查询、更新),这就是长事务(查询+更新)带来的开销;而乐观锁则是即可查询、又可更新,互不影响,增加了并发量,让前端体验更友好.

基于此,大家再理解悲观锁和乐观锁的概念和机制:

悲观锁特点:先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。数据库里面也用到了悲观锁的机制。比如行锁,表锁,都是在做操作之前先上锁,这样其他的事务就不能同步操作,必须要等到他释放才可以.

乐观锁特点:先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值