采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
更新时要加上,version版本号,号码一致,才能更新成功。 但是现在问题是,更新时,如何才能知道当前version版本号呢。还要查吗。 所以乐观锁version有必要吗,感觉不如用分布式锁,这样彻底解决问题对吧。
数据库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
框架屏蔽了底层的细节,因此对于框架的使用也是需要了解底层的实现细节,在使用的过程中才能更加的灵活。
非常感谢!
乐观锁能提高性能,分布式锁相对来说比较重。
但是我看分布式锁,好像不用增加数据库的version字段。所以我以为redisson分布式锁,还是比较轻量级的啊,关键功能强啊。
借助第三方工具,还要通过网络交互,redis肯定更消耗资源。杀鸡不能老用牛刀啊。
同问老师,更新时如何才能知道当前version版本号?
登录后可查看更多问答,登录/注册
可以改变的编程效率
1.6k 8
934 7
841 7
1.2k 6
912 6