gpt4 book ai didi

mysql - 获取 mysql 的最后一个插入 ID 如何处理事务? + 交易问题

转载 作者:IT老高 更新时间:2023-10-28 23:48:59 27 4
gpt4 key购买 nike

两部分问题:

  1. 在我的 CodeIgniter 脚本中,我开始一个事务,然后插入一行,将 insert_id() 设置为一个 php 变量,使用新 ID 作为外键将更多行插入到另一个表中,然后我 promise 一切。

    所以我的问题是:如果在结束事务之前一切都没有提交,如果什么都没有插入,mysql 如何能够返回最后的插入 ID?我的脚本(几乎)完美运行,新 ID 用于后续查询。

    (我说“几乎”是因为,使用 PDO mysql 驱动程序,有时应该返回 insert_id() 的第一个插入是重复的——它被插入了两次。知道为什么会这样吗?这与获取最后一个 ID?如果使用 mysqli 或 mysql 驱动程序,它永远不会发生。)

  2. 我首先编写了没有事务的脚本,所以我有一路检查 mysql 错误的代码,例如:

    if(!$this->db->insert($table, $data)) {
    //log message here
    }

    一旦我将所有 mysql 代码包装在一个事务中,这对 mysql 进程有何影响?它不会导致任何可见错误(希望与上述问题无关),但是否应该将其删除?

谢谢。

最佳答案

回答你的第一个问题...

使用事务时,就您的连接而言,您的查询会正常执行。您可以选择提交、保存这些更改,或者回滚、还原所有更改。考虑以下伪代码:

insert into number(Random_number) values (rand()); 
select Random_number from number where Number_id=Last_insert_id();

//php

if($num < 1)
$this->db->query('rollback;'); // This number is too depressing.
else
$this->db->query('commit;'); // This number is just right.

生成的随机数可以在提交之前读取,以确保它在保存之前适合所有人查看(例如,提交和解锁行)。

如果 PDO 驱动程序不起作用,请考虑使用 mysqli 驱动程序。如果这不是一个选项,您始终可以使用查询“select last_insert_id() as id;”而不是 $this->db->insert_id() 函数。

要回答您的第二个问题,如果您要插入或更新其他模型将要更新或读取的数据,请务必使用事务。例如,如果将“Number_remaining”列设置为 1,则会出现以下问题。

Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0

在相同情况下使用事务会产生这样的结果:

Person A starts transaction
Person A reads '1' from Number_remaining
(The row is now locked if select for update is used)
Person B attempts to read Number_remaining - forced to wait
Person A wins $1000
Person A updates 1 to be 0
Person A commits
Person B reads 0
Person B does not win $1000
Person B cries

您可能想阅读 transaction isolation levels也是。

小心死锁,在这种情况下可能会发生:

Person A reads row 1 (select ... for update)
Person B reads row 2 (select ... for update)
Person A attempts to read row 2, forced to wait
Person B attempts to read row 1, forced to wait
Person A reaches innodb_lock_wait_timeout (default 50sec) and is disconnected
Person B reads row 1 and continues normally

最后,由于人 B 可能已达到 PHP 的 max_execution_time,当前查询将独立于 PHP 完成执行,但不会收到进一步的查询。如果这是一个 autocommit=0 的事务,当与您的 PHP 服务器的连接被切断时,查询将自动回滚。

关于mysql - 获取 mysql 的最后一个插入 ID 如何处理事务? + 交易问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com