乐观锁和悲观锁

1.解释:

  悲观锁:

  • 拿到数据就加锁,别人再想拿这个数据的时候就会阻塞等待
  • 数据库本身中有悲观锁的提供,例如可以使用for update 来加上行锁
  • java中的悲观锁是基于Lock接口或者syncronized关键字实现的

  乐观锁:

  • 乐观锁是在数据中添加版本号来实现的,每次更新的时候,需要比较之前读到的版本号和更新的版本号是否一致
  • 数据库本身不提供乐观锁的实现,但是可以在表字段中添加版本字段
  • java中的乐观锁基于CAS非阻塞算法实现,juc就是基于CAS建立的

2.如何解决并发冲突?

  • 乐观锁版本号不一致,如果没有重试机制,一种比较懒得方法是直接返回给前端 --“数据正在处理,请稍后重试”
  • 后端添加重试机制,在代码中抛出异常,捕获异常后,后端自动重试

3.java中如何去实现一个乐观锁?

  • 首先在数据库表字段中添加版本号
  • 然后在业务方法上添加@Transactional注解 和 SpringRetry的 @Retryable注解(XXXException.class,MaxAttempted=XXX)指定发生并发冲突的异常以及重试次数  
  • 业务代码中先读取版本号,更新操作判断版本号是否一致,如果不一致就抛出异常,走重试机制
posted @ 2022-09-08 13:05  yky_xukai的胡思乱想  阅读(46)  评论(0)    收藏  举报