【问题标题】:MySQL skipped a row when inserting new recordMySQL在插入新记录时跳过了一行
【发布时间】:2016-03-21 18:24:42
【问题描述】:

问题是 mysql 在我们服务器上的 CPU 上运行很高,并且持续了大约 15 分钟。在那个时候,一些到达服务器的数据并没有被插入到数据库中,而是被提交了事务。

重启mysql后问题解决。

所以这意味着即使事务提交,表中也没有新行。这方面的证据是自动递增的主键,应该如下所示:

100
101
102

但目前是这样的:

100
102

所以记录 101 丢失并被跳过。

现在我需要为该记录找到某种日志(如果存在)。

我试过mysqldump log,但那里没有记录。记录 101 仍然丢失。

我需要找到一种方法来重新创建该事务并再次执行此操作。

有没有人遇到过类似的问题?

代码基本上是这样的:

$db->autocommit(FALSE);

$sql = "INSERT INTO t (amount, datetime) VALUES ($amount, '$datetime')";
$db->query($sql);

$id = $db->insert_id;
$sql = "INSERT INTO tr (id, log) VALUES ($id, '$log')";
$db->query($sql);

$db->autocommit(TRUE);

【问题讨论】:

    标签: mysql database mysqldump


    【解决方案1】:

    事务很可能在序列已经增加后中止。从数据库的角度来看,这不是问题:自动递增的列不需要按顺序包含所有 id。从代码/用户的角度来看,这也不应该是一个问题。如果您的代码需要连续的 id(假设是出于审计目的),则您必须自己实现一个系统。如果您不需要,那么只需再次运行事务。然后将创建 id 103(在您的情况下)。

    【讨论】:

    • 基本上问题是客户端从服务器得到了一切正常的响应并且他得到了他的票。但是该票不在服务器上,也不存在。所以我不需要顺序ID我只是说跳过的ID是mysql在插入时跳过一行并且没有抛出任何异常的证据。
    • 听起来你的代码没有检查事务状态:你能添加执行这个事务的代码吗?
    • 我用代码更新了我的问题,但我不知道这是否有助于它非常基本的东西
    • 好的,我同意:非常基本。然而,这应该返回一个错误:设置的事务边界与缺少的 101 id 一致。该错误永远不会被捕获,因此它可能会记录在您的 Web 服务器日志中或根本没有记录。添加try - catch 逻辑来记录错误是我唯一的建议。
    猜你喜欢
    • 2012-02-22
    • 2018-01-05
    • 2012-01-02
    • 2021-12-21
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多