高并发更新mysql问题

胡玉洋 
博客专家认证
2016-07-01 11:11:45
业务场景:奖池中共有100个奖品,开200个线程同时抽奖,并写入抽奖记录表,最终结果100个奖品全部抽完,但抽奖记录显示有116个抽奖成功的记录,重新测了一下,总是有多出十几二十几个线程会抽到奖。

代码中都进行了加锁控制,推测是mysql锁的问题,还有,跟mysql事务隔离级别有关系吗?这方面比较弱,跪求各路大神帮助!!!
...全文
2824 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrong1111 2016-08-26
  • 打赏
  • 举报
回复
基本大型的电子商务都会遇到这样的问题。。 给你个参考地址 http://blog.xuahua.com/articles/2016/08/26/1472198550085.html
胡玉洋  2016-08-10
  • 打赏
  • 举报
回复
引用 8 楼 FENGQIYUNRAN 的回复:
猜测你的抽奖程序有问题
程序没问题,加个悲观锁就可以解决,后来用乐观锁也可以。
tianfang 2016-08-07
  • 打赏
  • 举报
回复
使用排队机制将并发转串行处理,比如Lmax 的disrupter框架
FeelTouch Labs 2016-08-05
  • 打赏
  • 举报
回复
猜测你的抽奖程序有问题
FeelTouch Labs 2016-08-05
  • 打赏
  • 举报
回复
同步方法很多,最关键的是你要首先确定是程序的问题还是mysql问题,隔离出来分别测
zhxingway 2016-07-13
  • 打赏
  • 举报
回复
引用 2 楼 huyuyang6688 的回复:
[quote=引用 1 楼 zhxingway 的回复:] 再加入信号量试试
添加一个字段吗[/quote] 信号量用于解决线程同步啊。跟楼上的第三种方案的Semaphore一个意思
大雨将至 2016-07-06
  • 打赏
  • 举报
回复
引用 4 楼 huyuyang6688 的回复:
[quote=引用 3 楼 autfish 的回复:] 三种方案 1 把mysql隔离级别提高到可串行话,这样所有的读操作都会加锁读,不建议 2 使用排它锁 select ... for update,这样别的事务需要等待持有锁的事务完成操作才能读取 3 在应用中用缓存等方式控制,推荐
麻烦您能不能细说一下第三种方案,谢谢![/quote] 这得根据具体的业务场景来设计了 通常在应用中更容易处理并发 比如说通过java的Semaphore,或者redis控制实际进入抽奖的线程数,其他线程或者排队或者直接返回未中奖,在表现层做假的提示
胡玉洋  2016-07-06
  • 打赏
  • 举报
回复
引用 3 楼 autfish 的回复:
三种方案 1 把mysql隔离级别提高到可串行话,这样所有的读操作都会加锁读,不建议 2 使用排它锁 select ... for update,这样别的事务需要等待持有锁的事务完成操作才能读取 3 在应用中用缓存等方式控制,推荐
麻烦您能不能细说一下第三种方案,谢谢!
大雨将至 2016-07-06
  • 打赏
  • 举报
回复
三种方案 1 把mysql隔离级别提高到可串行话,这样所有的读操作都会加锁读,不建议 2 使用排它锁 select ... for update,这样别的事务需要等待持有锁的事务完成操作才能读取 3 在应用中用缓存等方式控制,推荐
胡玉洋  2016-07-01
  • 打赏
  • 举报
回复
引用 1 楼 zhxingway 的回复:
再加入信号量试试
添加一个字段吗
zhxingway 2016-07-01
  • 打赏
  • 举报
回复
再加入信号量试试

8,028

社区成员

发帖
与我相关
我的任务
社区描述
高性能数据库开发
社区管理员
  • 高性能数据库开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧