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

开源中国技术顾问 发布于 06/10 17:11
阅读 277
收藏 0

问题:

A线程查询出数据,若状态为1则进行一系列操作,然后更改状态。

B线程查询出数据将状态从1改为2。

现在B线程可能在A线程执行的时候同时发生导致A线程逻辑有问题

请问这个情况如何避免呢

加载中
0
官方公众号

这就需要了解锁的概念。如果系统对性能要求不高的话,比较容易实现,任何线程读取数据时先判断和更新锁的状态;如果锁已经被别的线程抢占则不能直接更新数据,需要不断循环等锁的释放。

开源中国技术顾问
开源中国技术顾问
能具体说下嘛 或者有相关文章吗?
0
独孤晓林

数据版本可以解决这个问题

0
龙飞hhl
乐观锁,悲观锁
0
曹冲
曹冲

读写锁了解下

0
xoHome
xoHome

不是有数据库事物么。。

0
tinshen
tinshen

a,b线程启用事务,在where的更新时候必须是状态=1,并set状态=2.

如果a更新成功,b一定会更新失败。

0
山哥
山哥

这个就是典型的数据库乐观锁

在表中增加一个类似的 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值

希望可以帮到你。

开源中国技术顾问
开源中国技术顾问
嗯 其实这就和自增时间 以时间为条件更新一个道理吧
返回顶部
顶部