如果事务中没有更改数据,COMMIT 与 ROLLBACK 的成本/性能

Bin*_*rus 5 mysql innodb transactions

免责声明:

我已经阅读了对于更便宜/更快的无写交易:COMMIT 还是 ROLLBACK?,这与我的问题类似,但与 MS SQL Server 相关,并且已经很老了。此外,答案不知何故让我感到惊讶,所以我想知道 MySQL 5.7 在 2018 年的情况如何。

说了这么多:

假设以下场景:

  • 我正在运行 MySQL 5.7。
  • 我已经关闭了隐式事务。
  • 我有一个 InnoDB 表。
  • BEGIN一个交易。
  • ISELECT ... FOR UPDATE锁定表中的几行(在大多数情况下,一行)。
  • 我检查了被选择/锁定的行,得出的结论是数据没有问题,因此......
  • ...我决定根本不更改被锁定行中的任何数据

现在我想完成交易。我可以用正常的方式来做到这一点,即通过发出 a COMMIT,在这种情况下只会删除锁,或者作为替代,通过发出 a ROLLBACK,在这种情况下也只会删除锁。

这两种方法的结果是一样的,但我的感觉是成本/性能可能会有很大差异。

如果被锁定的行的比例总是可以忽略不计(即像 1/1e6 这样的东西),有人可以告诉我推荐哪种方法,并且可能给出一些背景(或一些背景的链接)?

Ric*_*mes 3

(警告:这个答案是有根据的猜测,但可能是错误的。)

提交/回滚的通常用途是实际进行更改,然后撤消它们。InnoDB 是乐观的,因为它假设事务将被提交。也就是说,它最大限度地提高了更改(插入、更新等)的效率,而不是针对回滚进行优化。因此,ROLLBACK比 更昂贵(有时“更多”)COMMIT。潜在回滚的内容保存在撤消日志中,最终需要清理。但此清理工作是“稍后”完成的,而不是在用户等待COMMIT完成时完成。

您的使用不涉及任何实际更改,因此我猜测性能是相似的。我可能会ROLLBACK向未来的读者(包括你自己)明确表示“什么也没做”。

由于撤消内容的笨拙部分是行的旧副本,而您的情况不会生成这样的副本,因此我看不出有什么区别。

您的链接引用的是 SQL Server,它可能有不同的算法。