开发者社区> 问答> 正文

怎么保证一条数据更新时,其他线程对数据的操作是基于最新数据的。报错 

问题: A线程查询出数据,若状态为1则进行一系列操作,然后更改状态。 B线程查询出数据将状态从1改为2。 现在B线程可能在A线程执行的时候同时发生导致A线程逻辑有问题 请问这个情况如何避免呢

展开
收起
kun坤 2020-06-10 10:06:46 490 0
2 条回答
写回答
取消 提交回答
  • 这就需要了解锁的概念。如果系统对性能要求不高的话,比较容易实现,任何线程读取数据时先判断和更新锁的状态;如果锁已经被别的线程抢占则不能直接更新数据,需要不断循环等锁的释放。######能具体说下嘛 或者有相关文章吗?######数据版本可以解决这个问题######乐观锁,悲观锁######读写锁了解下######不是有数据库事物么。。######a,b线程启用事务,在where的更新时候必须是状态=1,并set状态=2. 如果a更新成功,b一定会更新失败。######这个就是典型的数据库乐观锁: 在表中增加一个类似的 version 字段(int类型),每次更新带上version条件判断,并将这个 version 字段+1,例如:

    -- 业务在更新前执行查询操作,此时把当时的 version 字段查询出来 select name, version from task where id=1;

    -- 业务在更新时,带上 version 条件, -- 如果在更新时已经有别的线程先更新了,则表中此时 version 字段的值就和你之前查询到的 version 值不一样了, -- 这样条件 where version=你的值 就不成立了,你的更新执行就无效了,从而解决了并发更新问题。 -- 这就是 version 乐观锁机制。 update task set name='新值', version=version+1 where id=1 and version=前面查询到的version值

    希望可以帮到你。######嗯 其实这就和自增时间 以时间为条件更新一个道理吧
    2020-06-11 11:46:27
    赞同 展开评论 打赏
  • 精于基础,广于工具,熟于业务。

    添加行锁

    2020-06-10 17:27:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
事务、全局索引、透明分布式 立即下载
低代码开发师(初级)实战教程 立即下载