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

    乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。

    版本号

    读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

    update tb_goods   
    set status=2,version=version+1  
    where id=#{id} and version=#{version}; 
    

    时间戳

    时间戳机制,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

    条件限制

    举个例子,当电商抢购活动时,大量并发进入,如果仅仅使用版本号或者时间戳,每次只会有一个用户扣减成功,不可避免的人为造成失败。
    num-#{buyNum}>=0 ,这个情景适合不用版本号,只更新时做数据安全校验,适合库存模型,扣份额和回滚份额,性能更高。

    UPDATE tb_goods
    SET num = num - #{buyNum} 
    WHERE
        id = #{id} 
    AND num - #{buyNum} >= 0 
    AND STATUS = 1
    

    乐观锁的更新操作,最好用主键或者唯一索引来更新,这样是行锁,否则更新时会锁表。

  • 相关阅读:
    正则表达式邮箱验证
    C# TCP应用编程三 异步TCP应用编程
    C# EventWaitHandle类解析
    Git关联远程仓库
    cqyz oj | 表亲结点 | 树上搜索
    cqyz oj | 健美操 | 树形DP | 二分猜答案
    cqyz oj | 树的分治 | 树形DP | 树的重心
    cqyz oj | 化装晚会加强版 | 二分搜索
    cqyz oj | 化装晚会 | 二分搜索 | 贪心
    POJ 1694 古老的游戏 | 贪心 | 树形DP
  • 原文地址:https://www.cnblogs.com/wesson2019-blog/p/13321928.html
Copyright © 2011-2022 走看看