首页 新闻 会员 周边 捐助

关于php的myisam与innoDB 行锁问题

0
悬赏园豆:200 [已解决问题] 解决于 2016-11-14 12:22

  最近在做一个项目,公司用的是ecshop2.7的这套商城,现在要做抢单的这个功能,但里面涉及到一个但一个商家抢到单之后,这个order_info里的这个订单就不再该改变,也就是锁行。请问各位大神有没有什么思路可以提供一下

惊天伟地的主页 惊天伟地 | 初学一级 | 园豆:21
提问于:2016-10-31 17:19
< >
分享
最佳答案
1

之前有个地方说过了.update table set state=lock where state=enable and id=123

就是业务状态.将每一个业务操作定义为2个状态间的迁移

 

收获园豆:200
吴瑞祥 | 高人七级 |园豆:29449 | 2016-10-31 17:50

?  能否说的详细点吗?   这个抢单功能就是一个在商户后台进行抢单,但抢到这个单的时候,列表里的这个单就添加到商户的订单列表里,同时这个抢单列表就没有这个单,别的商户也抢不到,有一个极端情况,就是两个商户同时抢单。

惊天伟地 | 园豆:21 (初学一级) | 2016-10-31 17:55

@惊天伟地: 抢单接口传入单id

在抢单接口开始时执行抢单验证

update 可抢单列表 set state=lock where state=enable and id=单id

返回修改行数.行数为1就抢单成功为0就失败.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-31 17:58
其他回答(4)
-1

是用的事务吗?之前做过就是在事务之前先锁定,事务开始,接触锁定,其实就是事务那一块加个判断。不知道有木有帮组

小木啊 | 园豆:176 (初学一级) | 2016-10-31 18:06

想用的事物  但是我的是ecshop  用的是myisam    它是表锁   不是行锁

支持(0) 反对(0) 惊天伟地 | 园豆:21 (初学一级) | 2016-10-31 18:08

@惊天伟地: 表锁肯定不行的,http://blog.csdn.net/e421083458/article/details/17569657,你看下这个吧,设置这个系统变量concurrent_insert

支持(0) 反对(0) 小木啊 | 园豆:176 (初学一级) | 2016-10-31 18:11
0

1 换成innodb

2 既然用myisam,表锁无法回避的情况下,中间用队列做隔离,保证后面顺序执行,通过更新条件判断是否抢到。

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-01 11:33
0

乐观锁,可以去了解一下。使用时间戳。

码有钱 | 园豆:13 (初学一级) | 2016-11-01 18:20
0

抢单锁定,保持数据的准备性,一单对应一个商家。

晓菜鸟 | 园豆:2594 (老鸟四级) | 2016-11-02 17:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册