version乐观锁问题

来源:12-7 实现系统级字段自动填充功能

蓝色西西

2020-03-10

更新时要加上,version版本号,号码一致,才能更新成功。
但是现在问题是,更新时,如何才能知道当前version版本号呢。还要查吗。
所以乐观锁version有必要吗,感觉不如用分布式锁,这样彻底解决问题对吧。

写回答

2回答

SnoWalker_Q

2022-01-26

数据库version版本号,本质上是CAS操作,在数据库层面实现无锁的并发访问控制;

而分布式锁,依赖具体的实现,无论是基于redis实现,或者使用开源的redission,基于zk自己实现或者使用curator,都不可避免的会发生多次网络调用,并且和数据库乐观锁比起来,由于分布式锁是在应用代码层面就进行了串行化,因此吞吐量会明显下降。

但是我们不能就说数据库version版本号一定比分布式锁好,还是看场景的,比如说在分布式协调的场景下,我们就偏向于使用zk/redis分布式锁;

在复杂的长事务业务场景,如广告、供应链等业务下,使用zk、redis分布式锁也会比基于数据库version版本号更加方便,原因在于不是所有的业务都是基于db访问的,它有可能涉及到跨多个服务的调用,数据不一定在本地,但是还是要实现复杂链路的串行化,那么通过分布式锁实现并发控制成本就会更低。

还是需要看场景。

至于如何知道version版本号,则需要一次查询,然后执行更新操作将version传递给db层面。

SQL本质上是这样的:update tablexxxxx set 业务字段名=业务字段,version=version+1 where version=本地查询出来的version

框架屏蔽了底层的细节,因此对于框架的使用也是需要了解底层的实现细节,在使用的过程中才能更加的灵活。


1
1
蓝色西西
非常感谢!
2022-02-11
共1条回复

张小喜

2020-03-10

乐观锁能提高性能,分布式锁相对来说比较重。

1
5
Joshua721
回复
乃好
id 先查当前的 然后再更新
2021-12-17
共5条回复

Java高效编程技巧实践 告别996

可以改变的编程效率

1451 学习 · 326 问题

查看课程