什么是乐观锁
与悲观锁相比,乐观锁认为数据一般不会发生变化,因此不会加锁,但是在更新数据时会对数据进行比较,若数据没有变化,则进行更新,否则不进行更新。
适用场景
适用于读多写少的场景。
如何实现乐观锁
方式1:版本号机制
给表增加一个 version
版本号字段,具体流程如下:
- 读取数据时,将数据的版本号数据一同读出;
- 数据每次发生更新时,将版本号加 1;
- 提交数据时,将当前版本号与之前读出的版本号进行对比。若相同,则更新;否则,更新失败。
方式2:记录时间戳
原理与方式一相同,给表增加一个记录操作的时间戳字段,当发生数据更新时,将当前时间戳与更新前获取的时间戳进行对比,若相同,则允许更新,且同时更新操作时间戳字段,否则更新失败。
优缺点
优点
- 不会发生任何锁和死锁
- 可增加吞吐量
- 避免了长事务中的数据库加锁开销
缺点
对于写多的场景并不适用,因为当写操作非常频繁时,更新失败的几率就越大,上层逻辑进行retry的次数也会增多,从而降低了系统的性能。
总结
不管是乐观锁还是悲观锁,其目的都是为了保障数据的一致性。乐观锁与悲观锁的区别在于,乐观锁会在更新前比较数据是否发生变化,若变化则更新失败。悲观锁则是等待前一个事务完成才执行自己的操作。