利用阿里tair实现乐观锁初探

前言

好久没有写博客了,到了阿里后空闲的时间更少了,很少有机会再专门研究技术了。这篇博客是刚去时在内网发布的一篇博客,利用了阿里的tair分布式缓存。tair是不开源的。但笔者觉得这篇博客还是有必要分享的,因为思路。很多人实现锁,并未真的抓住乐观锁、悲观锁的区别,理解上甚至会混淆。所以笔者把这篇博文搬出来,大家看思路就好。
正文
基于tair的分布式锁,在阿里内部技术社区已经有很多讨论了,不过基本上都是基于悲观锁的实现,基本特征是互斥或者阻塞。但实际的业务场景中,并不是所有的地方都需要悲观锁,写冲突很少的场景(例如:员工、门店信息修改),使用乐观锁更为合适。
那么如何设计和使用乐观锁呢?在看具体的代码前需要先对乐观锁的原理有个简单的了解。

乐观锁

乐观锁特点

version,版本控制,是乐观锁的根基。乐观锁并不是真的锁,它只是加了一个标识,用于区分数据是否有被意料之外的更改过。若没有,那就正常提交事物结束操作;若有,则回滚事物,撤销所有操作。所以,乐观锁除了需要应用于写冲突很少的场景,还要求系统支持事物回滚或补偿。

乐观锁操作流程

trylock(获取版本)--> transaction --> unlock(版本检查) --- 正常---> version+1 commit
--- 异常---> rollback

设计要求

  • 1.只要能获取版本,就认为trylock成功
  • 2.版本检查则更新version,一般是加1;否则,异常处理,version不变,并开启回滚
  • 3.多事物同时获得乐观锁时,unlock只能有一个成功,其余的都应该失败

结合tair

有了上述设计要求,具体的实现就要参考tair api的特点了。这里笔者使用的是zcache,是蚂蚁基于 ldc 逻辑对 tair 的封装࿰

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
回答: 乐观锁和悲观锁是实现并发控制的两种主要手段。乐观锁适用于读多写少的情况,它不依赖于数据库中的锁机制,而是通过在表中新增一个版本号来实现乐观锁的特点是无论是否开启事务,都可以在逻辑上实现乐观锁乐观锁的开销比悲观锁小,但一旦发生锁冲突需要回滚,开销比较大。乐观锁适合用在取锁失败概率较小的场景,可以提升系统的并发性能。\[2\] 悲观锁适用于写多读少的情况,它需要依赖数据库的锁机制来实现。在事务中使用select ... for update操作来实现悲观锁,可以最大程度地保证数据操作的独占性。悲观锁的特点是需要开启事务,并且会对扫描过的行进行锁定,这可能导致性能问题。悲观锁主要用于数据争用激烈的环境,以及在锁保护数据的成本低于回滚事务的成本的情况下使用。\[3\] 需要注意的是,乐观锁和悲观锁不仅仅存在于关系型数据库系统中,还存在于其他系统中,如hibernate、tair、memcache等。因此,不应该将乐观锁、悲观锁与其他数据库锁进行对比。它们是一种思想,用于实现并发控制。\[1\] #### 引用[.reference_title] - *1* [MySql悲观锁(行锁)和乐观锁](https://blog.csdn.net/weixin_45433031/article/details/120838045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MySQL中的悲观锁和乐观锁](https://blog.csdn.net/lamp_yang_3533/article/details/79180370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值