JDBC 随机获取 5 行数据,在 update 之前怎么防止并发的其他线程获取到重复的数据

2019-10-17 15:38:32 +08:00
 meinjoy

随机获取到 5 个不同的数据 id

  1. SELECT id,state FROM (select * from test_list where state=0) t WHERE id >= ((SELECT MAX(id) FROM test_list)-(SELECT MIN(id) FROM test_list)) * RAND() + (SELECT MIN(id) FROM test_list) LIMIT 5;

  2. 然后更新状态 state=1

后来发现个问题,第一次查询获取到 5 个随机 id ( 20,343,123,309,234 ),还没有 update 的时候,有其他线程获取的数据也有 20 这个 id

这种情况怎么避免?

4494 次点击
所在节点    Java
23 条回复
zhaorunze
2019-10-18 09:49:10 +08:00
@petelin 加版本是啥意思,还有这么 low 的操作吗,可能我的事务被 spring 托管了
jsy123392550
2019-10-18 10:07:41 +08:00
感觉这语句乐观锁要比悲观锁开销大啊,还是别用版本号了吧
Aresxue
2019-10-18 13:09:00 +08:00
用悲观锁吧,别自旋了,感觉冲突的几率还不小(假设取值是完全随机的,获取每个值对地概率都一样,那么概率是((n-5)/n)^5?)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/610303

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX