1.乐观锁

      认为数据的更新在大多数情况下是不会产生冲突的,只在数据库更新操作提交的时候才对数据作冲突检测。如果检测的结果出现了与预期数据不一致的情况,则返回失败信息。

实现方法:
     1.借助版本号version 

数据库表增加一个版本号的字段version,每次更新一行记录,都使得该行版本号加一,开始更新之前先获取version的值,更新提交的时候带上之前获取的version值与当前version值作比较,如果不相等则说明version值发生了变化则检测到了并发冲突,本次操作执行失败,如果相等则操作执行成功。

例如:update table set columnA = 1,version=version+1 where id=#{id} and version = #{oldVersion}

   2. 借助行更新时间时间戳

       与方式1相似,即更新操作执行前先获取记录当前的更新时间,在提交更新时,检测当前更新时间是否与更新开始时获取的更新时间时间戳相等

当应用并发量高的时候,version值在频繁变化,则会导致大量请求失败,所以综合数据库乐观锁的优缺点,乐观锁比较适合并发量不高,并且写操作不频繁的场景。

另外:CAS操作也是一种乐观锁

 

2.悲观锁

       对数据进行操作更新时,对操作持悲观保守的态度,认为产生数据冲突的可能性很大,需要先对请求的数据加锁再进行相关的操作。

实现方式:通过数据库锁机制实现,即对查询语句添加for update关键字。

 悲观锁适合写操作频繁的情况

synchronized的思想也是悲观锁。