首页 新闻 会员 周边 捐助

多线程 并发问题

0
悬赏园豆:50 [已解决问题] 解决于 2017-07-20 15:06

情况是有两台服务器同时运行程序,然后是一个抽奖程序,奖品的数量是有限制的(每一种奖品每天发放多少,一共发放多少都是有数的超过就不在发放,剩下的概率为零).
1.怎么样避免数据重复插入
2.怎样避免多发或者少发

因为以前出现过类似的情况,本人初学,能力有限,所以希望有一个好的解决办法?请帮忙梳理一下流程

tanhao09的主页 tanhao09 | 初学一级 | 园豆:35
提问于:2017-07-20 11:53
< >
分享
最佳答案
0

update 表名 set 数量字段-=1 where 商品id=id and 数量字段>0

返回影响行数为1则发放成功.为0则失败.

收获园豆:40
吴瑞祥 | 高人七级 |园豆:29449 | 2017-07-20 12:27

 我的数据库设计是有一个奖品表,表中有奖品名称,等级,一共发放数量,每天发放数量,已经中奖的数量,还有一个抽奖记录表,所有的数据都记录,如果抽中奖品就更新奖品表中的中奖数量,如果中奖数量大于等于每天发放数量就不在发放,概率就为零了.所以感觉不适用啊

tanhao09 | 园豆:35 (初学一级) | 2017-07-20 13:51

@tanhao09: ,如果抽中奖品就更新奖品表中的中奖数量,如果中奖数量大于等于每天发放数量就不在发放

你这样看觉得适用不?而且我说的只是在update语句的条件中加上 合理 的限制条件来解决并发问题.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-20 14:19

@吴瑞祥: 应该能适用,但是如果我这个奖品的当天的总发放量是20,在开始的时候查询时是19个,在程序运行的过程中另一个程序更新了数据库为20,那么我这一条就失败了,可是事实上这个人已经抽中了奖品,有抽中奖记录,只是没有更新成功.他在我的奖品中也能看到,那么我是不是需要把抽奖记录的插入顺序和更新的顺序改变一下,先更新更新成功再插入记录,否则记录也不插入?

tanhao09 | 园豆:35 (初学一级) | 2017-07-20 14:30

@tanhao09: 所以你要在事务里操作.然后根据update条件更新结果判断事务是否成功.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-20 14:38

我改了一下代码理论上是解决了但是我还是想多问点其他的方法,拓展一下知识面,我在网上找过一种方法是用利用redis的原子性,将奖品总数是20分成多少20份,放在redis的一个列表中,中一个取出一个,当列表中没有时,不在发放,或者将中奖数放在redis中,中一个,取出中奖数,和总数判断有没有超出,没有相加,超出不在相加,同时不在返回.楼上的时间戳的方法我没有弄明白.

tanhao09 | 园豆:35 (初学一级) | 2017-07-20 15:06

@tanhao09: redis的原子性..怕不是活在梦里..

你可以百度下:sql数据库事务的特性.总的来说并发问题处理确实是靠原子性保证来做的.

数据库支持是最好的.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-20 20:38

@吴瑞祥: 好的,受教了,我回头仔细看看,谢谢了

tanhao09 | 园豆:35 (初学一级) | 2017-07-20 21:38
其他回答(2)
0

给数据库记录增加时间戳,更新的时候,带上时间戳条件。如果中途有人更新过,那么你会更新失败。

收获园豆:10
幻天芒 | 园豆:37207 (高人七级) | 2017-07-20 12:05

 我的数据库设计是有一个奖品表,表中有奖品名称,等级,一共发放数量,每天发放数量,已经中奖的数量,还有一个抽奖记录表,所有的数据都记录,如果抽中奖品就更新奖品表中的中奖数量,如果中奖数量大于等于每天发放数量就不在发放,概率就为零了.所以感觉不适用啊

支持(0) 反对(0) tanhao09 | 园豆:35 (初学一级) | 2017-07-20 13:51

我又查了一下相关的资料,您的意思是不是在开头查询记录,记录带时间戳的字段,在更新的时候带上update 表名中奖数量加1and update_time=查询的时间戳, 如果中间没有被更改过就更新,更改过就不更新?可是这样的话,如果别人更改了,我这条数据不就不能更新了吗?

 

支持(0) 反对(0) tanhao09 | 园豆:35 (初学一级) | 2017-07-20 14:16

@tanhao09: 是指你在查询数量和提交更改后的数量之前,没有其他人操作(保证数量是准确的)。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2017-07-20 17:35
0

你的问题是 两个客户端,访问同一个数据库,两个客户端同时增删改查,有可能造成一个数据同时进行操作的问题?

猝不及防 | 园豆:2882 (老鸟四级) | 2017-07-20 14:17

对,是这样的

支持(0) 反对(0) tanhao09 | 园豆:35 (初学一级) | 2017-07-20 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册