如果在短时间内调用两次 PHP MySQL 更新不会执行
Posted
技术标签:
【中文标题】如果在短时间内调用两次 PHP MySQL 更新不会执行【英文标题】:PHP MySQL update not execute if call twice in short time 【发布时间】:2017-01-17 08:50:15 【问题描述】:我在 mysql 中使用 CodeIgniter。案例是,客户购物,并用帐户付款。
代码如下:
$globallockname = 'MEM_LOCK_ORDER_PAYLOCK';
//lock with memcache add
if (!$this->getGlobalLock($globallockname, 10))
dexit(array('error'=>true,'msg'=>'get loack failed'));
//check if account is enough
$member = $this->admin_model->getItem('member', array('id'=>$this->_member['id']), false);
if ($this->_member['account'] >= $amountpay)]
//pay
$this->admin_model->update('member', "`account` = `account` - ".$amountpay, "`id` = ".$this->_member['id']);
else
//unlock
$this->delGlobalLock($globallockname);
dexit(array('error'=>true,'msg'=>'account is short, please recharge'));
//unlock
$this->delGlobalLock($globallockname);
当客户点击“购买”一次,一切正常,但如果他们在短时间内点击“购买”两次,此脚本将执行两次,第一次更新将不起作用。
我检查了$db->query
的返回值,每个都返回true。
【问题讨论】:
“短时间”有多短?不到一秒?几分钟? @Simba,在 1 或 2 秒内。 @Shoyeb Sheikh,用完整代码更新问题。 【参考方案1】:您将同一字段更新两次。所以你只会得到最后一次更新。 即第一次更新被第二次更新覆盖..
希望这会有所帮助...
【讨论】:
但我是通过添加它的值而不是绝对数字来更新字段,所以我想它应该添加两次,而不是覆盖它。【参考方案2】:单击购买按钮后,将其禁用并显示进度条。这将避免进一步的点击。
【讨论】:
实际上我已经禁用了按钮,当客户再次点击按钮时发生这种情况。 更新应该是一个关联数组。所以应该是这样的: $this->admin_model->update('member', array("account
=> account
- ".$amountpay), "id
= ".$this->_member ['ID']);参考:codeigniter.com/user_guide/database/…
当参数不是数组时,更新函数会执行查询脚本。代码如下: public function update($db, $table, $data, $where) if (empty($db) || empty($table)) return false; $db = $this->load->database($db, true); if (is_array($data)) return $db->update($table, $data, $where); else return $db->query("UPDATE " . $db->dbprefix($table) . "
SET $data WHERE $where"); 【参考方案3】:
我做了一件愚蠢的事情,mysql或codeigniter没有任何问题。在我的索引控制器中,我去成员成员信息然后再次设置它,所以内存缓存锁不起作用,信息被覆盖......
【讨论】:
以上是关于如果在短时间内调用两次 PHP MySQL 更新不会执行的主要内容,如果未能解决你的问题,请参考以下文章
尝试在短时间内连续第二次运行 SQL 查询时 Java 挂起