如果在短时间内调用两次 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 更新不会执行的主要内容,如果未能解决你的问题,请参考以下文章

如何在短时间内调用大量http请求

使用PHP在短时间内解析大型CSV文件

尝试在短时间内连续第二次运行 SQL 查询时 Java 挂起

在短时间内替换多个位[关闭]

Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)

PHP - MySQL - 表不存在