欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-08 09:04:46
...

结合公司目前业务场景来理解悲观锁、乐观锁的机制原理——抢单功能实现:查询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个人同时抢单,悲观锁机制,抢单(查询、更新)完后,其他人才可抢单(查询、更新),这就是长事务(查询+更新)带来的开销;而乐观锁则是即可查询、又可更新,互不影响,增加了并发量,让前端体验更友好.

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

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

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

上一篇:

下一篇: