乐观锁和悲观锁
1.解释:
悲观锁:
- 拿到数据就加锁,别人再想拿这个数据的时候就会阻塞等待
- 数据库本身中有悲观锁的提供,例如可以使用for update 来加上行锁
- java中的悲观锁是基于Lock接口或者syncronized关键字实现的
乐观锁:
- 乐观锁是在数据中添加版本号来实现的,每次更新的时候,需要比较之前读到的版本号和更新的版本号是否一致
- 数据库本身不提供乐观锁的实现,但是可以在表字段中添加版本字段
- java中的乐观锁基于CAS非阻塞算法实现,juc就是基于CAS建立的
2.如何解决并发冲突?
- 乐观锁版本号不一致,如果没有重试机制,一种比较懒得方法是直接返回给前端 --“数据正在处理,请稍后重试”
- 后端添加重试机制,在代码中抛出异常,捕获异常后,后端自动重试
3.java中如何去实现一个乐观锁?
- 首先在数据库表字段中添加版本号
- 然后在业务方法上添加@Transactional注解 和 SpringRetry的 @Retryable注解(XXXException.class,MaxAttempted=XXX)指定发生并发冲突的异常以及重试次数
- 业务代码中先读取版本号,更新操作判断版本号是否一致,如果不一致就抛出异常,走重试机制

浙公网安备 33010602011771号