悲观锁:认为线程问题一定会发生,在操作数据之前就获取锁,确保线程串行执行。列如Synchronized、lock
乐观锁:认为线程问题不一定发生,因此不加锁,只是在更新数据时去判断有没有其他线程对数据进行了修改。如果没有修改则认为是安全的,自己才更新数据。
如果已经被其他线程修改说明发生了安全问题,此时可以重试或异常。
乐观锁解决方法:
1.额外设置一个版本号,每个线程处理的时候加1,处理数据前判断版本是否和刚开始查询的数据一致(把版本号当作查询条件)(where语句做判断),一致则继续处理数据,否则重试或者异常;
2.cas法:在版本控制方法基础上,剔除额外的版本,直接将已经查询到的需要更新的数据(库存)当作条件和原先查询的数据进行比较,如果和原先数据不一致则重试或者返回异常。(数据库进行操作不是使用Java中的if对原先查询到的数据和需要更改的数据做判断而是理解为用where做判断是在执行更新操作的一瞬间)
标签:重试,判断,更新,查询,乐观,线程,悲观,数据 From: https://www.cnblogs.com/liu-jin/p/17112085.html