如果同时插入两条记录,如何获取最后一个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 但您没有向我们展示另一个表 mysql 的last_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的主要内容,如果未能解决你的问题,请参考以下文章