如果同时插入两条记录,如何获取最后一个ID

Posted

技术标签:

【中文标题】如果同时插入两条记录,如何获取最后一个ID【英文标题】:how to get last id if two record inserted at same time 【发布时间】:2019-01-27 15:14:03 【问题描述】:

我有一个查询,我编写了一个程序,在数据库中创建了一个条目,我得到了 last_id,使用这个最后一个 id 在第二个表中更新。

$table='user';
$data = array('array having user data');
$this->db->insert($table, $data);
$last_id = $this->db->insert_id();

$this->db->where('user_id', $last_id);
$this->db->set('wallet_total_amount', "wallet_total_amount");

在这样的程序中,当两个条目同时创建时,第二个事务的 id 会更新为第一个记录。 如何避免这种情况。请提出建议。

【问题讨论】:

你应该学习如何使用事务,看看这个答案:***.com/a/2708247/1911019 “在这样的程序中,当两个条目同时创建时”如何?你只 INSERT 一次.. 或者你想问一下这种方法是否容易出现 race condition 我不太清楚你在问什么。看起来您正在获取在第一个 INSERT 中创建的新 id 并使用它来做 something 但您没有向我们展示另一个表 mysqllast_insert_id 与连接绑定。虽然交易绝对是一个好主意,但它并不一定是必需的。万一出现问题,绝对回滚 “在这样的程序中,当两个条目同时创建时,第二个事务的 id 会用第一条记录更新” - 不,不是,因为最后一个插入 id是连接特定的。 【参考方案1】:

您需要使用事务,基本上是一个接一个地提交一个查询。事务允许您一次执行一组查询,锁定数据库直到所有查询都运行(或回滚,以防出错)。

用户 1

自动提交关闭

    运行查询 1(插入数据) 检索 last_insert_id 使用 last_insert_id 运行查询 2

提交

用户 2

自动提交关闭

    运行查询 1(插入数据) 检索 last_insert_id 使用 last_insert_id 运行查询 2

提交

要在 codeigniter 中使用事务,请查看 this 答案。 Here你可以找到php文档。

【讨论】:

请注意,他正在使用框架至少链接到框架文档如何在那里进行交易。 他没有直接问这个问题(这就是为什么我只是试图解释这个理论),顺便谢谢你的建议,我正在编辑答案。 你不需要使用交易来做我认为被要求的事情 last_insert_id 与连接有关。同时运行的 2 个脚本会有不同的连接,因此 last_insert_id 不会在 2 个脚本之间混淆 我没有他用来连接数据库的代码,我从他的问题中了解到他正在尝试插入数据,获取插入查询产生的最后一个id,然后插入其他一些使用 last_id 的数据。他的意思是,如果其他用户正在执行 [whatever action],则使用的最后一个插入 id 是不正确的。这个问题应该使用事务来解决,防止数据库同时为不同的用户操作。

以上是关于如果同时插入两条记录,如何获取最后一个ID的主要内容,如果未能解决你的问题,请参考以下文章

Informix:如何获取最后插入记录的 id

如何在没有'id'列的MySql中获取最后插入的记录?

如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID

如何在mssql中获取最新自增ID的值

获取刚刚插入的记录ID?

如何从 JayData 事务中获取最后插入 ID?