zoukankan      html  css  js  c++  java
  • MySQL乐观锁

      MySQL悲观锁是依靠数据库的锁机制来实现,以实现最大程度上的独占性。但由于现代的web系统一般都是高并发的,所以悲观锁在这样的情况下的适用性不高,所以我们有了和悲观锁相对应的乐观锁。

      乐观锁,是说假设认为数据一般情况下不会造成冲突,在数据进行提交更新的时候,会对数据的冲突与否进行检测,如果发生冲突了,则返回错误的信息,让用户决定如何去做。

      乐观锁的实现一般是在程序中来控制的。常规的实现一般有两种:使用数据版本(version),使用时间戳来实现。

    实现详情:

    1. 在表里添加一个字段version或者时间戳字段;

    2. 在查询的时候,将该字段返回,更新的时候,先校验version字段或时间戳字段是否和表里的字段一致,如果一致就更新,并且把version字段加1(时间戳的话更新为当前时间),如果不一致就说明该字段已经被更新过,提示更新失败,然后把错误信息返回给用户;

     通过一些伪代码来实现:

    -- 伪代码:
    -- 1. 并发查询,都查询id=1的记录
    mysql> SELECT * FROM test_order WHERE id = 1;
    +----+--------+------+----------+---------+-------------+
    | id | status | name | goods_id | version | update_date |
    +----+--------+------+----------+---------+-------------+
    |  1 |      1 | 茅台 | 123      |       1 | NULL        |
    +----+--------+------+----------+---------+-------------+
    1 row in set
    
    -- 2. 用户1执行更新操作
    UPDATE test_order 
    SET status=1, version=version+1 
    WHERE id=1 and version=1 
    
    -- 3. 此时version是2,用户2再次执行更新操作,但此时就更新不成功了
    UPDATE test_order 
    SET status=1, version=version+1 
    WHERE id=1 and version=1

    乐观锁适用用冲突不多的场景,只有在最后更新的时候才去看是否冲突。所以如果冲突很多的话,数据争用激烈,会导致不断尝试,反而会降低性能。

    所以,一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。(http://bbs.csdn.net/topics/340001655)

    常用的SVN便是通过这种乐观锁类似的方式来实现的。

     

    参考公众号:码农翻身

  • 相关阅读:
    web.xml中openEntityManagerInViewFilter的作用(转)
    JNDI解读(转)
    Java读取大文件的高效率实现
    快速入门react
    谈一谈我所了解的https
    漫谈JWT
    Java 中的几种线程池这么用才是对的
    用Vue来实现图片上传多种方式
    一个页面从输入URL到页面加载显示完成,这个过程都发生什么?
    “===”与“==”的区别
  • 原文地址:https://www.cnblogs.com/xiaozhang2014/p/7787665.html
Copyright © 2011-2022 走看看