美文网首页
MySQL中的乐观锁

MySQL中的乐观锁

作者: youthcity | 来源:发表于2018-12-09 23:57 被阅读61次

    什么是乐观锁

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

    适用场景

    适用于读多写少的场景。

    如何实现乐观锁

    方式1:版本号机制

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

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

    方式2:记录时间戳

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

    优缺点

    优点

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

    缺点

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

    总结

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

    参考资料

    相关文章

      网友评论

          本文标题:MySQL中的乐观锁

          本文链接:https://www.haomeiwen.com/subject/gobkhqtx.html