MySQL 事务难题

2023-12-23

我需要在单个原子事务中执行多次插入。例如:

开始交易;

插入 ...

插入 ...

commit;

然而,当 MySQL 遇到错误时,它只会中止导致错误的特定语句。例如,如果第二个插入语句中有错误,提交仍然会发生,并且第一个插入语句将被记录。因此,当发生错误时,MySQL 事务并不是真正的事务。为了解决这个问题,我使用了一个错误退出处理程序来回滚事务。现在交易已悄然中止,但我不知道问题出在哪里。

所以这就是你的难题:

如何让 MySQL 在遇到错误时中止事务并将错误代码传递给调用者?


我怎样才能既MySQL当事务遇到错误时中止事务,并将错误代码传递给调用者?

MySQL确实将错误代码传递给调用者,并且根据此错误代码,调用者可以自由决定是否要提交到目前为止完成的工作(忽略此特定的错误)INSERT语句)或回滚事务。

这与PostgreSQL它总是在出错时中止事务,这种行为是许多问题的根源。

Update:

使用无条件是一种不好的做法ROLLBACK存储过程内部。

存储过程是可堆叠的,而事务则不是,所以ROLLBACK在嵌套存储过程中将回滚到事务的最开始,而不是回滚到存储过程执行的状态。

如果要使用事务来恢复出现错误的数据库状态,请使用SAVEPOINT构造和DECLARE HANDLER回滚到保存点:

CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

任一插入失败都会回滚该过程所做的所有更改并退出它。

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

MySQL 事务难题 的相关文章

随机推荐

  • 具有多个参数的 PostgreSQL 聚合

    我一直在尝试在 PostgreSQL 8 4 或 9 1 中创建接受一个或多个选项参数的聚合 一个例子是创建一个PL R计算第 p 个分位数的扩展 其中0 lt p lt 1 这看起来像quantile x p 并作为查询的一部分 sele
  • 为什么无法创建分区表

    我正在尝试创建带有分区的简单表 这是我的命令 CREATE TABLE measurement city id int not null logdate date not null peaktemp int unitsales int PA
  • Mongo DB 3.0.7(安装在 Amazon EC2 上)上的远程和本地身份验证失败

    我创建了一个管理员用户 gt db createUser user administrator pwd password roles role userAdminAnyDatabase db admin Successfully added
  • .Net FtpWebRequest 有时会失败

    我尝试使用 FtpWebRequest 列出文件详细信息 但经常失败并出现 WebException 并显示错误 530 用户未登录 有时使用相同的凭据可以正常工作 这怎么可能 代码摘录 reqFTP FtpWebRequest FtpWe
  • 在 Rust 中迭代切片的值而不是引用?

    当循环结构体切片时 我得到的值是一个引用 这很好 但是在某些情况下 必须编写很烦人var as var 在很多地方 有没有更好的方法来避免重新声明变量 fn my fn slice MyStruct for var in slice let
  • 如何定义“AT-POS”方法?

    我定义了AT POS类的方法并导出 操作员 当我使用 然而 在该类的实例上 编译器忽略了我定义的运算符 这是代码 unit module somelib class SomeClass is export method AT POS ind
  • 将 C cstyle 数组视为 std::array

    是否有任何安全且符合标准的方法可以将 C 样式数组视为 std array 而不将数据复制到新的 std array 中 这显然无法编译 但却是我想要的效果 我的实际使用更复杂 但这个简短的示例应该显示我想要做的事情 我想reinterpr
  • 是否可以从另一个进程释放泄漏的内存?

    我有一个简单的测试 C 程序 它泄漏了 4 个字节的内存 include
  • 比较 Java8 中的 Instant

    我有这个对象 public class MatchEvent implements Serializable private static final long serialVersionUID 1L Id GeneratedValue s
  • max-width:auto == max-width:100% 吗?

    Is max width auto equal to max width 100 如果不是 有什么区别 他们不平等 auto不是有效值max width 如果您正在寻找一个表示 该元素的宽度没有上限 的值 则该值是none 参见规格max
  • 空检查对象中的解构变量

    我有下面所示的解构代码end time财产来自this props auction object const auction auction end time this props 但这里的问题是 如果拍卖是空对象 则上述常量将是未定义的
  • Swift WKWebView:调用方法时找不到变量错误

    我正在尝试将 GPS 坐标传递给方法调用setIOSNativeAppLocation 我有下面的代码 但我收到此错误 A JavaScript exception occurred UserInfo WKJavaScriptExcepti
  • Typescript 中的对象平等[重复]

    这个问题在这里已经有答案了 我正在打字稿中的向量上创建一个库 我的第一次测试失败了 它与 TypeScript JavaScript 中的对象相等有关 但我找不到一种方法来使测试变得绿色 Typescript 的官方文档中没有提到对象相等性
  • 如何在高图表中超链接条形图

    我有一个 highcharts 可以根据数据库中的数据呈现数据 我使用的是 bar 类型 现在我希望当用户单击该栏时 它将重定向到特定页面或例如另一个网站 我已经用谷歌搜索但无法得到答案 这是我正在使用的代码 function var ch
  • 以编程方式删除 field_group

    我在 Drupal 7 中有一个名为 group imagecache 的 field group 我如何以编程方式删除它 我尝试阅读代码 似乎它使用了 ctools 但我宁愿不使用 ctools ctools 是 field group
  • 仅在 spock 中基于调用次数模拟方法的返回

    是否可以根据调用方法的第 n 次来模拟 spock 中方法的返回值 请注意 我不想指定传入的参数 因为它对于特定的测试用例并不重要 例如 对于第一次调用 它应该返回 x 对于第二次调用 它应该返回 y 对的 这是可能的 someObject
  • 云存储桶中的公共对象无法通过负载均衡器访问

    我为我的 Google Cloud Storage 存储桶设置了 CDN 我已经上传了一个公共对象 您可以通过此处的公共链接查看它 https storage googleapis com staging twinkle 4acfc app
  • PlayFramework 2 + Ebean - 原始 Sql 更新查询 - 对数据库没有影响

    我有一个 play Framework 2 0 4 应用程序想要修改数据库中的行 我需要将数据库中的 少数 消息更新为 已打开 状态 读取消息 我做了如下 String sql UPDATE message SET opened true
  • 为什么 Pandas 默认会迭代 DataFrame 列?

    尝试了解 Pandas 某些功能背后的设计原理 如果我有一个包含 3560 行和 18 列的 DataFrame 那么 len frame 是3560 但是 len a for a in frame is 18 也许对于来自 R 的人来说这
  • MySQL 事务难题

    我需要在单个原子事务中执行多次插入 例如 开始交易 插入 插入 commit 然而 当 MySQL 遇到错误时 它只会中止导致错误的特定语句 例如 如果第二个插入语句中有错误 提交仍然会发生 并且第一个插入语句将被记录 因此 当发生错误时