MySQL中的乐观锁

什么是乐观锁

与悲观锁相比,乐观锁认为数据一般不会发生变化,因此不会加锁,但是在更新数据时会对数据进行比较,若数据没有变化,则进行更新,否则不进行更新。

适用场景

适用于读多写少的场景。

如何实现乐观锁

方式1:版本号机制

给表增加一个 version 版本号字段,具体流程如下:

  • 读取数据时,将数据的版本号数据一同读出;
  • 数据每次发生更新时,将版本号加 1;
  • 提交数据时,将当前版本号与之前读出的版本号进行对比。若相同,则更新;否则,更新失败。

方式2:记录时间戳

原理与方式一相同,给表增加一个记录操作的时间戳字段,当发生数据更新时,将当前时间戳与更新前获取的时间戳进行对比,若相同,则允许更新,且同时更新操作时间戳字段,否则更新失败。

优缺点

优点

  • 不会发生任何锁和死锁
  • 可增加吞吐量
  • 避免了长事务中的数据库加锁开销

缺点

对于写多的场景并不适用,因为当写操作非常频繁时,更新失败的几率就越大,上层逻辑进行retry的次数也会增多,从而降低了系统的性能。

总结

不管是乐观锁还是悲观锁,其目的都是为了保障数据的一致性。乐观锁与悲观锁的区别在于,乐观锁会在更新前比较数据是否发生变化,若变化则更新失败。悲观锁则是等待前一个事务完成才执行自己的操作。

参考资料

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容