【数据库】乐观悲观锁记录

乐观锁

乐观锁实际上并没有加锁,只是一种锁思想,一般通过在行数据上添加版本号字段实现,在更新数据前,先查询出当前行数据的版本号,更新数据时,将版本号加1,并判断数据库中版本号是否等于前面我们读取出来的版本号,如果不一致,说明数据被修改过,更新失败。乐观锁的核心语句是:update table set ... version=version+1 where id=#{id} and version=#{version};

乐观锁使用场景:比较适合读多写少的场景,因为如果出现大量的写入操作,version字段值发生冲突的可能性就会增大,更新失败后,应用层需要不断的重新获取最新version字段数据,并重试操作,这样会增加大量的查询操作,降低了系统的吞吐量。

悲观锁

悲观锁一般是使用 select ... for update; 语句锁定行数据,更新完提交事务后自动释放行数据,在此期间,其他事务无法更新这一行数据。
悲观锁使用场景:比较适合写多读少的场景,因为如果出现大量的读取操作,每次读的时候都进行加锁,会增加大量的锁的开销,降低了系统的吞吐量。