获取 mysql 的最后插入 ID 如何与事务一起使用? + 交易问题

2024-04-20

一个由两部分组成的问题:

  1. 在我的 CodeIgniter 脚本中,我启动一个事务,然后插入一行,将 insert_id() 设置为 php 变量,使用新 ID 作为外键将更多行插入到另一个表中,然后提交所有内容。

    所以我的问题是:如果在结束事务之前一切都没有提交,那么如果什么都没有插入,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

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

A开始交易
A 读取“1” 剩余数量
(该行现在被锁定,如果选择更新 http://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html用来)
乙人 尝试读取 Number_remaining - 被迫等待
A 获胜 1000 美元
A 将 1 更新为 0
A 人承诺
乙人 读取 0
B 没有赢得 1000 美元
B 人哭了

您可能想阅读事务隔离级别 http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html以及。

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

A 读取第 1 行(select ... for update)
B 人读行 2(select ... for update)
A 尝试读取第 2 行, 被迫等待
B 尝试读取第 1 行,被迫等待
A 人到达innodb_lock_wait_timeout http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout(默认 50 秒)并且是 断开连接
B 读取第 1 行并正常继续

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 mysql 的最后插入 ID 如何与事务一起使用? + 交易问题 的相关文章

  • Laravel - 带有 join 和 concat 的查询生成器

    我试图从用户表中提取与 users groups 数据透视表中某个组匹配的所有用户 顺便说一句 我使用的是来自 Cartalyst 的 Sentry 2 这可以让所有用户的名字和姓氏连接起来 User select DB raw CONCA
  • 删除并加入同一个表

    是否可以执行连接同一个表的删除查询语句 我尝试过各种连接 内部 左侧 但没有运气 mysql 返回错误 我需要的例子 DELETE a FROM t1 AS a INNER JOIN t1 AS b USING some field b W
  • 在 PHP MySQL 中使用 jQuery AJAX 提交表单而无需重新加载

    我有一个基本的注册 登录页面 它使用 php 将数据提交到 SQL 数据库 但是 我希望页面在 jQuery AJAX 的帮助下不要在提交时重定向 无论成功与否 这是我目前所拥有的 但不起作用 它不显示任何错误消息 HTML 注册 html
  • 每次使用 COUNT() 函数,还是存储该值并将其加一?

    我有一个带有用户 投票 表和 用户 表的数据库 我认为数据库会在短时间内变得相当大 所以我想使用最有效的方法 我想我可以每次使用 投票 表中的 WHERE 语句来 COUNT 投票数 或者我可以将分数存储在 用户 表中 每次投票时将其增加
  • Laravel 查询生成器 - 高级条件子句(可选参数)

    我需要带有接受可选参数的查询生成器的子句 例如 请考虑以下情况 我们有三个搜索字段 产品标题 公司名称和位置 邮政编码 城市或州 2 3 8 种可能性 该位置与 OR 连接 WHERE location postal code LIKE O
  • 从 MySQL 转储中删除 DEFINER 子句

    我有一个数据库的 MySQL 转储 其中有 DEFINER 子句 如下所示 DEFINER root localhost 也就是说 这些 DEFINER 子句位于我的 CREATE VIEW 和 CREATE PROCEDURE 语句中 有
  • 使用 socket.io node.js 和传入消息的通知系统的架构实现和设计

    免责声明 我之前没有使用过node js 我以前没有使用过socket io 我正在考虑实现 Google Plus Facebook StackOverflow 风格的通知系统 我不是一个没有经验的开发人员 最终我会解决这个问题 但我只是
  • Laravel - SQL - SQLSTATE[01000]:警告:1265 第 1 行列“nsfw”的数据被截断

    我试图保护数据库中的一些数据并收到以下错误 SQLSTATE 01000 警告 1265 第 1 行的列 nsfw 的数据被截断 nsfw 列的标准值是 0 这是我的桌子 nsfw 列也在模型中 fillable array 我想检测是否选
  • 如何通过csv文件仅更新sql表的一列

    我有一个 csv 文件包含一些数据 在我的 Sql 数据库中 我有一个具有多个列名的表 现在我只想通过 csv 文件更新一列 谢谢 你可以这样尝试 Import the csv file to a temp table Update you
  • 如何使用Query备份MySQL数据库?

    我们如何使用 Query 备份 MySQL 数据库 就像我们可以使用以下 Query 备份 MS SQL 一样 Query backup database DATABASENAME to disk PATH 使用 mysqldump php
  • mysql REGEXP 不匹配

    我有一个正则表达式 旨在捕获字符串中的电话号码 1 s d 3 s d 3 s d 4 我尝试使用以下查询在 MySql 数据库中查询此正则表达式 SELECT FROM everything instances meta AS m WHE
  • 使用 JDBC 3.0 实现对嵌套事务的支持

    我们的遗留应用程序使用 JDBC 3 0 它通过实现自己的事务管理器来支持事务 该事务管理器能够为每个线程返回相同的 JDBC 连接 我最近发现的问题是它不支持嵌套事务 如果一个事务在另一个事务中启动 那么在内部事务上下文中运行的每个 SQ
  • 如何选择按范围分组的值的计数

    斯塔克万岁 我需要选择按范围分组的值的计数 举例来说 假设我在表列中有以下值 1 2 4 5 6 8 9 11 13 16 然后 我想检索 5 范围内它们的计数 如下所示 From 0 to 4 there is 3 values 1 2
  • 在 CodeIgniter 中使用 ajax 时出现 403 禁止错误

    我正在显示我的名字textbox使用 ajax 自动完成 但我的 ajax URL 不起作用 每次都显示在网络选项卡中 403 禁止 我尝试过像这样的ajax URL url baseUrl index php Employee contr
  • MySQL如何获取可能重叠日期的开始/结束日期之和

    我有一个开始 结束日期表 我想按 id 对其进行分组并对每个 id 的总时间进行求和 例如 fk id start end 3 2014 03 21 10 02 2014 05 01 08 05 3 2014 06 05 05 00 201
  • 这段php代码安全吗?

    我知道我应该使用准备好的语句 但我的下一个项目将使用准备好的语句 我只需要完成这个简单的小应用程序 所以我的问题是 以下代码片段安全吗 我使用了 htmlentities 以及 mysql real escape string 因为我认为这
  • 优化 SELECT 和 WHERE 子句中的存储函数调用

    我有一个具有以下结构的 SQL 查询 SELECT storedfunc param table field as f FROM table WHERE storedfunc param table field lt value ORDER
  • PHP md5() 给出与 MySQL md5 不同的输出

    我正在尝试设置登录系统 但无法解决一个问题 PHP 通过 md5 给了我另一个输出 比MySQL 例如 在 PHP 中 password md5 brickmasterj return password 返回 3aa7b18f304e2e2
  • NodeJS:MySQL 有时会引发 ETIMEDOUT 错误

    我目前正在使用 NodeJS 开发一个应用程序 然而 经常服务器抛出这个错误 我无法与mysql交互 Error read ETIMEDOUT code ETIMEDOUT errno ETIMEDOUT syscall read fata
  • Codeigniter 中的 HTML 格式的电子邮件

    如何在 codeigniter 中发送格式化的电子邮件 我有这段代码 可以很好地发送电子邮件 但它没有按应有的方式格式化它 您可以看到显示收到电子邮件的图片 function email sender this gt load gt hel

随机推荐

  • std::variant 似乎不适用于 C++ 中的shared_ptr

    通过下面的代码 我得到 In static member function static std shared ptr
  • C++20 内存模型中释放序列定义的更改有何影响?

    考虑这个程序 Initially std atomic
  • Java中如何处理未知的protobuf字段?

    我有一个 Java 应用程序 它从另一台计算机读取一些 protobuf 数据 然后修改一些值并将其写回 用户很可能使用过时的 proto 文件读取数据 因此在这种情况下会有一些字段无法理解 我最终希望在写回所做的更改时保留未知的数据 但是
  • 是否可以反转包含循环的链表?

    我正在看一些面试问题 其中一个要求反转包含循环的链表 所以假设我有一个如下所示的链接列表 F lt E V A gt B gt C gt D 然后反转列表将创建以下内容 F gt E V A lt B lt C lt D 这里的问题是 C
  • 在不破坏寻呼机的情况下获取第一个集合项

    我之前发布了一个关于此问题的问题 但我现在有了更多信息 我认为最好发布一个新问题而不是修改 抱歉 如果这不是正确的协议 你可以找到我原来的问题here https stackoverflow com questions 6311646 ma
  • 警告: array_key_exists() 期望参数 2 为数组,给定布尔值 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有下面的代码 它检查数组中是否存在
  • 使用 R 进行快速 url 查询

    您好 必须查询网站 10000 次 我正在寻找一种真正快速的方法来使用 R 来做到这一点 作为模板网址 url lt http mutationassessor org cm var var 7 55178574 G A 我的代码是 url
  • 访问父 DOM 中的 iframe 窗口对象

    我有一个项目 其中有来自其他领域的元素 我正在使用 JavaScript 将第一个 iframe 窗口对象访问到变量中 这是代码 var iframes window frames grab first iframe var ifrWind
  • 本地数据库是否有任何选项,例如用于 j2me - CLDC 设备的 Sqlite?

    本地数据库是否有任何选项 例如用于 j2me CLDC 设备的 Sqlite PerstLite 和 OpenBaseMovil 均享有双重许可 是否有任何开源选项 或者 开发应用程序的任何替代方法 from J2ME中的数据库列表 htt
  • Android 推荐且可靠的 API 用于定期后台工作?

    我一直在使用 WorkManager 为我的应用程序创建通知 就我的目的而言 我认为PeriodicWorkRequest是最合适的 但经过一些测试和在线阅读后 它似乎非常不可靠 使用最小间隔 15 分钟 并关闭应用程序 该工作人员醒来 5
  • ASP.NET Core API 在 React 客户端调用时返回 401

    我正在开发一个带有 React Redux 前端的全新 ASP NET Core 2 1 SPA 应用程序 我已经实施了jwt从 Azure AD B2C 获取其令牌的身份验证 当我分析对后端 API 调用的网络选项卡时 我看到令牌被放置在
  • jQuery - iPad/iPhone - 禁用滚动后启用滚动

    我使用以下方法禁用了 iPad 上的滚动 function disableScrolling document ontouchmove function e e preventDefault 有没有办法简单地再次启用它 这对于以下函数特别有
  • iOS:在导航栏下方添加固定图像

    感觉这应该相当简单 但到目前为止我尝试过的都没有成功 简而言之 我想在我以编程方式创建的 UITableViewController 中的导航栏下方添加一个固定图像 换句话说 我希望图像保持在导航栏的正下方 即使用户在表视图中上下滚动 它基
  • RNGCryptoServiceProvider 已过时

    我需要使用随机数字和字母生成令牌 但是 错误消息告诉我使用 RandomNumberGenerator 它只会给我随机数 这没有帮助 错误信息 RNGCryptoServiceProvider 已过时 RNGCryptoServicePro
  • Scrapy 阿拉伯字母返回一些奇怪的东西

    我在用scrapy关于阿拉伯字母和英文字母 英文字母完美地工作 然而 阿拉伯字母显示如下 gs300 2006 u0644 u0643 u0632 u0633 u062c u064a 有什么帮助吗 我正在使用 python 和 scrapy
  • 如何编写一个程序来通过 Android 设备安装和卸载应用程序?

    我想编写一个程序 可以通过 Android 设备安装和卸载应用程序 由于这些功能是通过 Android 设备提供的 但是我应该从哪里开始以及需要查看哪些文件来开发我自己的应用程序 请帮帮我 提前致谢 Praween 对于这样的安装代码 In
  • 使用委托调用构造函数

    I found this http blogs msdn com haibo luo archive 2005 11 17 494009 aspx但尝试使用它但失败了 如何使用反射创建对象并通过将其放入委托中来使其快速 DynamicMet
  • 多租户主键的最佳方法

    我有一个被多个客户使用的数据库 我真的不希望代理增量键值在客户端之间流动 我希望编号从 1 开始并针对特定客户 我将使用由两部分组成的复合键tenant id以及增量 id 为每个租户创建增量密钥的最佳方法是什么 我正在使用 SQL Ser
  • Android 滚动视图不会一直向下滚动

    我查看了很多问题 但列出的解决方案都没有解决我的问题 Scrollview 不会滚动到底部边缘 https stackoverflow com questions 17124680 scrollview doesnt scroll to t
  • 获取 mysql 的最后插入 ID 如何与事务一起使用? + 交易问题

    一个由两部分组成的问题 在我的 CodeIgniter 脚本中 我启动一个事务 然后插入一行 将 insert id 设置为 php 变量 使用新 ID 作为外键将更多行插入到另一个表中 然后提交所有内容 所以我的问题是 如果在结束事务之前