PHP 板


LINE

看板 PHP  RSS
※ 引述《sunz5010 (FoFo)》之铭言: : : 以上是先拿出库存再来算数量,但是您要考虑 innodb_lock_wait_timeout , : : 这个预设是 50 秒,等起来有点久。或是考虑另一种作法,不要 select 直接计算 : : $sth = $dbh->prepare("UPDATE scart SET qty = qty - :qty : : WHERE id = :id and qty - :qty > 0"); : : $sth->execute(array(':qty'=>$qty, ':id'=>$id)); 补充一下,如果是一次购买多件商品,这边可以 $dbh->beginTransaction(); 每执一行 update 叙述之後,拿 rowCount() 来看 $sth = $dbh->prepare("UPDATE scart SET qty = qty - :qty WHERE id = :id and qty - :qty >= 0"); $sth->rowCount(); foreach($productIdList as $pid) { $sth->execute(array(':qty' => $qty, ':id' => $pid)); if($sth->rowCount() == 0) { // 简化一点,在途中有遇到 rowCount 回传是 0 就直接 rollback throw new Exception('update error.'); } } $dbh->commit(); 然後 PDO 自己 commit failed 也会 throw exception 所以只要在外层 catch exception 然後 $dbh->rollback() 即可。 流程控制大概是这样。 : : 然後 update 失败就代表库存不够,叫使用者重新回页面购买。 : 谢谢你的分享、我也顺便分享一下我的作法 : 我原本的问题是 : 「仓库」:1颗苹果 : 「甲」=>想买苹果 : 「乙」=>想买苹果 : 而买苹果的机制如为(1)先检查有没有苹果 (2)有的话就买 : 但要让整个机制都在Critical Secion底下、就需要一个lock : 观念是 : 「Lock资源」=>篮子 : 机制是=>谁先抢到「篮子」、就能购买 : if(篮子) : { : (1)检查有没有苹果 : (2)有的话就买 : } : else //拿不到篮子的情况 : { : 等待拿篮子、并且尝试拿取 : } : 让我困扰的是、要制作这个Lock资源、必须要有一个具有实现lock功能的工具 : 於是我想到了MySQL的Primary Key : 我的作法是、创造一个「MyLock」的Table : 里面可以有很多资讯、但主要的就是要有一个LockName这个PrimaryKey : (我这个Table其实也只放了这一个栏位) : 所以作法如下: : /*****Start*****/ : //买东西之前 : reslut = MySQL(insert into MyLock (LockName) value ("篮子")) : while(result=>ErrorCode == 1062) //1062:重复的PK : { : //有人拿了篮子、等待一秒、之後尝试拿篮子 : sleep(1); //先等待一个时间 : result = MySQL(insert into MyLock (LockName) vlaue ("篮子"); : } : //Critical Secion [Start] : (1)检查仓库有没有苹果 : (2)有的话就买 : //Critical Secion [End] : MySQL(delete from MyLock where LockName = '篮子') //释放篮子资源 : /*******End*******/ : 这个方式挺容易的 : 而且没有复杂的MySQL判断跟指令 : 另外跟原本的lock 观念也一致 : 分享给大家@@、如果我的方法有什麽问题也欢迎讨论 一个购物车,要考虑同时购买苹果香蕉橘子柳丁,以及所有水果的库存。 然後大家应该要都可以同时买东西,看来照你的作法,看来一次只能有一个人买。 如果同时三个人买,就算库存足够,也得等 (是吗?) -- The Internet: where men are men, women are men, and children are FBI agents. --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.89.121.16
1F:推 sunz5010:疑、你说的对ㄝ~我是没有考虑到你这个问题 03/25 12:48
2F:→ sunz5010:不过我想、这也是可以在Critical Section那边去抉择 03/25 12:48
3F:→ sunz5010:决定一次处理多少的量、不过这个问题或许也牵扯到服务 03/25 12:49
4F:→ sunz5010:等待的问题、我在想这个或许是另外一个议题 03/25 12:50
5F:→ sunz5010:因为LOCK是一个观念、至於你要怎麽运用这个LOCK 03/25 12:50
6F:→ sunz5010:也要看你演算法怎麽设计、不过你点醒了我没注意到的地方 03/25 12:51
7F:→ sunz5010:还谢谢你的提醒@@ 03/25 12:51
※ 编辑: roga 来自: 202.89.121.16 (03/25 16:00)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP