免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6454 | 回复: 12
打印 上一主题 下一主题

mysql并发问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-21 17:27 |只看该作者 |倒序浏览
情况是这样的:我现在有一个项目,是一个编辑系统,每天大概有30到40个编辑在上面工作,每一个编辑在领取一条数据的时候都会把这条记录的IsAssign字段置为1表示这条记录已经有人领取了,别人不能再去领取这条任务去做了,也就是他们点击领取任务的时候程序会先去判断这条记录的IsAssign是否为1如果为1不读取这条记录换下一条,否则读取这条记录并把标志位IsAssign置为1,这样看起来似乎没什么问题,但是,我最近还是发现每天有一两个人领取到了重复的任务,而数据库记录的是同一时间领取的,这个同一时间是指一模一样的在数据库里存在的,我现在想问的是是否是mysql的并发导致的这个问题呢,如果是并发导致的那么(在不加锁的情况下)该怎么解决呢?

论坛徽章:
0
2 [报告]
发表于 2011-11-21 17:56 |只看该作者
查询是不加锁的
办法
1:查询的时候直接锁表,查出来,更新完在解表
2:先更新表,后拿上次更新的数据

论坛徽章:
0
3 [报告]
发表于 2011-11-21 18:02 |只看该作者
回复 2# yangyang1581


        我不喜欢锁表,我以前采用锁表机制的时候,mysql经常死掉,所以怕了!

论坛徽章:
0
4 [报告]
发表于 2011-11-21 19:02 |只看该作者
经典到不能再经典的更新丢失问题,不说事务、for update,你可以简单地试试

update tab set IsAssign = 1 where ....  and IsAssign=0

论坛徽章:
0
5 [报告]
发表于 2011-11-22 08:28 |只看该作者
楼上的应该可以解决你的问题。

论坛徽章:
0
6 [报告]
发表于 2012-02-15 18:03 |只看该作者
4楼正解,判断返回的影响 在进行下一步的逻辑

论坛徽章:
0
7 [报告]
发表于 2012-02-19 22:29 |只看该作者
版主的应该可以。就是考虑竞态问题。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:55:28
8 [报告]
发表于 2012-02-21 19:04 |只看该作者
回复 4# bs


    请教下,如果数据存在与内存中,遇到这种更新丢失问题,如何解决呢?

论坛徽章:
0
9 [报告]
发表于 2012-02-21 21:25 |只看该作者
xinglu1983 发表于 2012-02-21 19:04
回复 4# bs


本地的文件锁、信号锁;
第三方的共享内存锁、分布式锁;
使用特定共享内存自带的比如redis的WATCH - MULTI事务;
。。。。。。。。。。。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:55:28
10 [报告]
发表于 2012-02-22 11:11 |只看该作者
回复 9# bs


    加锁的方式会不会也出现这种更新丢失问题呢?因为本身查看是否加锁、加锁的步骤也不是一个原子操作。
    redis这个功能倒是不错,和sql的那个效果一致了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP