作者:周晨于 2017年09月18日 发布在分类 / 开发技术 / Java 下,并于 2017年09月18日 编辑
    开发中遇到的数据库更新丢失问题

       380

       0


    自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下
    前提:什么是数据库更新丢失?
    举个栗子,假设有如下情况:
    1、小A查询了数据库
    2、小B也查询了数据库,两个人不在同一个session中
    3、小A修改了数据库中的一行,并提交
    4、小B也修改了数据库的一行,但提交晚于小A
    这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题

    解决方案:
    1、悲观锁
    通过采用select for update或者select for update nowait,
    逻辑是:
    小A先查 


    小B后查    小B的查询会锁住,在页面的表现应该就是阻塞,什么数据也没有。

    2、乐观锁
    采用在数据库中表中加版本号和时间戳的形式进行加锁,项目中采用的是时间戳的形式,因为个别表中有这个字段:op_tm--操作时间。
    逻辑是:
    在update的时候,比较旧的时间戳,因为所有更新都会更新时间戳,那么最后一次更新也就是步骤四中的时间戳还是旧的时间戳,但已经被步骤三的替代了,所以步骤四的更新会失败。步骤三的更新得以保存,步骤四的“丢失”。步骤四的“丢失”算不算更新丢失,不算,因为是建立在错误数据的更新。

    下面where语句的最后的判断就是比较的时间戳:


    访问权限

    创建人 周晨
    文档编辑权限 创建者私有
    文档阅读权限 来自分类
    分类阅读权限 所有人
    分类编辑权限 所有人
    分类审核权限
    标签

    更新 数据 时间 数据库 步骤 丢失 修改 查询 因为 就是
    历史版本

    修改日期 修改人 备注
    2017-09-18 09:35:14[当前版本] 周晨 CREAT
    附件

    PNG

    同类知识
    相关知识

    睿恒知识库-V3.2.0