我有一个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,这就像正在删除状态字段的更新。
我将添加更新触发器,看看是否能提供更多信息。
答案 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)。
我有这个问题。