【问题标题】:MySQL which is the method to rollback a transaction effective?MySQL回滚事务的方法有哪些?
【发布时间】:2012-11-05 16:07:20
【问题描述】:

我在这里和谷歌的多个答案中看到回滚事务仅意味着回滚最后一个命令,我还读到这意味着所有命令。 (既没有记录也没有被引用)

我需要做的是创建一个在表 A 上插入/更新的存储过程,获取 A 的最后一个 ID,将该 ID 插入 B,获取 B 的最后一个 id,将其插入 C 等,等等,等等

我想知道在事务中提交或回滚所有命令的方法是什么,以便启动事务,如果出现故障,将所有内容恢复为原始。

IF 错误和 last_id 的 SQL 代码将受到重视,因为我也看到了很多不同的方法来获取最后一个 id,但我不知道哪个更好。

顺便说一下,所有的表都是InnoDB

亲切的问候,

【问题讨论】:

  • 您需要关闭自动提交。然后可以将一组更新作为单个事务提交。 dev.mysql.com/doc/refman/5.0/en/commit.html
  • 根据官方文档,如果您执行“开始事务”,则自动提交设置为关闭。是不是真的?

标签: mysql transactions sql-update innodb sql-insert


【解决方案1】:

如果你 BEGIN 一个事务,那么在你 COMMIT 它之前什么都不会被应用。断开连接或发出ROLLBACK 与从不提交它是一样的。

当然,这是假设您设置了autocommit,通常情况就是这样。

如果您也将单个命令包装为事务,则可以回滚它们。

更多信息请访问the documentation

请记住,MyISAM 和其他引擎不支持事务,而 InnoDB 则支持。此外,只有INSERTUPDATEDELETEREPLACE 语句能够回滚。其他事情,例如对架构的更改,则不是。

【讨论】:

  • 如果你使用启动事务,自动提交设置为关闭,文档说。这是真的?哪个更好?开始或开始交易? +1 顺便说一句
  • 我不会太担心autocommit 在事务期间被切换。只需发出BEGIN、一系列操作和COMMIT,如果您准备将其永久化。如果您在操作过程中遇到错误,您可以恢复或中止事务。
  • 优秀。您可以建议什么方法来检查是否有错误并确保安全?因为看了三四法,怀疑是“最后一个错误”还是“某个错误”,所以需要“任何错误”
  • 这完全取决于您的驱动程序。有些会引发异常,有些会返回错误代码,而有些则必须检查查询结果或语句句柄的状态。许多基于 MySQL C 驱动程序的驱动程序具有可以查询的最后一个错误方法,因此毫不奇怪,许多驱动程序都遵循此约定。
  • 这通常是矫枉过正。看看你的数据库驱动程序可以做什么,或者找到一个可以为你管理很多这些的包装类或 ORM。在适当的框架中,它通常几乎毫不费力。
【解决方案2】:

START TRANSACTION, COMMIT, and ROLLBACK Syntax 中所述:

这些语句提供对transactions 使用的控制:

[ deletia ]

  • ROLLBACK 回滚当前事务,取消其更改。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2013-05-05
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多