乐观锁
乐观锁认为一般情况下数据不会造成冲突(所以叫“乐观”),所以在数据进行提交更新时才会对数据的冲突与否进行检测。
它本身是种程序设计思想,通过一种标识来决定数据是否可以操作。
现在普遍的做法是给数据加一个版本号或者时间戳的方式来实现乐观锁操作过程。例如新增一个 version 字段,更新的时候:
1 | UPDATE ... SET version=version+1 WHERE version=version |
悲观锁
悲观锁获取数据都会认为数据可能被修改。在获取数据的时候会加锁,确保使用过程不会被修改。
也是程序设计的思想。例如线程读写数据加锁,其他线程等待锁释放,才可以操作数据。
异同点
都是程序设计的思想体现,通过数据库字段/代码层面来控制,并非数据库引擎自身的锁
乐观锁适合读频繁场景
悲观锁适合写频繁场景。
悲观锁会在数据层面加锁,比如在redis中存分布式锁、mysql里开个记录专门标记锁。
但是乐观锁不会。就像前面代码,它只是通过程序在查询时,比较字段。并没有新增锁相关的字段。