更新查询有时不会更新mySQL数据库中的字段

时间:2013-01-08 22:57:47

标签: mysql innodb

我有一个mySQL更新查询,有时会更新所有字段,有时它会更新除一个字段之外的所有字段。

大约10%的电话失败了。

我的表是:

CREATE TABLE IF NOT EXISTS `grades` (   
`id` int(11) NOT NULL AUTO_INCREMENT,   
`state` int(1) NOT NULL,   
`result` varchar(255) NOT NULL,   
`date_synced` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`) ) 
ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4395 ;

我的查询是:

$sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date', updated_at = '$date' WHERE id = $id";

如果失败,则更新result,date_synced和updated_at,但状态保持不变。

还有另一个查询仅更新状态字段,并且还会间歇性地失败。

我无法在测试环境中重新创建问题。生产mySQL数据库或某种锁定冲突会出现问题吗?


我有更多信息。我正在使用mysqli。只更新状态的另一个查询是使用mysql。这会导致问题吗?

我以为InnoDB被行锁定了。它不允许部分行更新,是吗?


解决评论的另一个更新。

我的代码流非常线性。

The row is created with state=0.
<flash stuff here> and the row is updated with state=1
A cron job pulls all state=1 and sends an api call
if api call is successful, the row is updated with state=2, result, date_synced, and updated_at
if api call is error, the row is updated with state=3, result, and updated_at

状态字段永远不会设置为0(闪存之后)或1(在api调用之后)。由于日期_synced和结果正在设置但是(有时)状态仍为1,这就像正在删除状态字段的更新。

我将添加更新触发器,看看是否能提供更多信息。

4 个答案:

答案 0 :(得分:1)

是否说明&#34; {n}受影响的行?&#34;

此外,它是否可重复;你可以对完全相同的数据运行相同的查询,它会做不同的事情吗?

如果是这样,您可能会损坏安装或损坏的数据库。

你试过修理吗?优化表?这可能有所帮助。

对于枪弹回答抱歉:P

答案 1 :(得分:0)

将MySQL中的“严格性”重新调整为传统:

SET sql_mode = 'TRADITIONAL';

并在没有PHP的情况下从控制台尝试插入。然后检查可以解释它的错误。

通过以下方式将严格性重置为“原谅”:

SET sql_mode = '';

或者,如果您使用PDO对象连接到数据库,则会通过PHP返回错误,如下所示:

try {
  $sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date',updated_at = '$date' WHERE id = $id";
$s = $pdo->exec($sqlstr);
}
catch (PDOException $e) {
  $error = $e->getMessage();
  echo $error;
}

基本上,尽一切可能获取正在发生的错误消息。最有可能的是SQL发送错误,但PHP没有设置为在脚本中显示它。

答案 2 :(得分:0)

尝试更改&#39;州&#39;中字段的名称对其他事情,比如&#39; state_num&#39;。虽然它没有列为MySQL的保留字,但它的名称可能会导致问题。

答案 3 :(得分:0)

您的查询设置&#34;州&#34;和其他字段运行两次,有时您的任务之一比另一个完成得更快。它更新所有字段,调用该任务的脚本也运行MySQL查询,更新&#34; state&#34;领域。

例如,您有一个运行shell命令的PHP脚本&#34; tar&#34;在后台通过exec()并设置&#34; state&#34;完成后在DB中。 PHP代码的下一个字符串会更新您的状态&#34;在您的数据库中。但有时你调用的bash命令比PHP脚本调用MySQL更新运行得更快(如果这个bash命令在后台模式下运行)。

第一步:从PHP运行bash脚本,设置&#34; state&#34;完成后,= 3(等待进一步处理),更新日期等其他字段

下一步:在exec()之后的PHP中设置&#34; state&#34; = 2(正在处理中)。在这种情况下,如果您在后台使用bash脚本比PHP运行MySQL更新查询更快地完成工作,您将获得更新的日期值以及&#34; state&#34; = 2(但是它在1秒前有值= 3)。

我有这个问题。