请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

version乐观锁问题

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

正在回答

2回答

数据库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 19:01:44
张小喜 2020-03-10 12:22:54

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

1 回复 有任何疑惑可以回复我~
  • 提问者 蓝色西西 #1
    但是我看分布式锁,好像不用增加数据库的version字段。所以我以为redisson分布式锁,还是比较轻量级的啊,关键功能强啊。
    回复 有任何疑惑可以回复我~ 2020-03-10 16:19:41
  • 张小喜 回复 提问者 蓝色西西 #2
    借助第三方工具,还要通过网络交互,redis肯定更消耗资源。杀鸡不能老用牛刀啊。
    回复 有任何疑惑可以回复我~ 2020-03-12 15:58:28
  • 乃好 #3
    同问老师,更新时如何才能知道当前version版本号?
    回复 有任何疑惑可以回复我~ 2020-05-05 11:55:48

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信