【问题标题】:PHP MySQL update not execute if call twice in short time如果在短时间内调用两次 PHP MySQL 更新不会执行
【发布时间】: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,用完整代码更新问题。

标签: php mysql codeigniter


【解决方案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没有任何问题。在我的索引控制器中,我去成员成员信息然后再次设置它,所以内存缓存锁不起作用,信息被覆盖......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多