怎么保证一条数据更新时,其他线程对数据的操作是基于最新数据的。报错  -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

kun坤 2020-06-10 10:06:46 93

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

分享到
取消 提交回答
全部回答(2)
  • kun坤
    2020-06-11 11:46:27

    这就需要了解锁的概念。如果系统对性能要求不高的话,比较容易实现,任何线程读取数据时先判断和更新锁的状态;如果锁已经被别的线程抢占则不能直接更新数据,需要不断循环等锁的释放。######能具体说下嘛 或者有相关文章吗?######数据版本可以解决这个问题######乐观锁,悲观锁######读写锁了解下######不是有数据库事物么。。######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值

    希望可以帮到你。######嗯 其实这就和自增时间 以时间为条件更新一个道理吧
    0 0
  • 不语奈何
    2020-06-10 17:27:42

    添加行锁

    0 0
添加回答
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章