【问题标题】:Cost / performance of COMMIT vs. ROLLBACK if no data has been changed in the transaction如果事务中没有数据更改,COMMIT 与 ROLLBACK 的成本/性能
【发布时间】:2019-02-28 06:42:59
【问题描述】:

免责声明:

我已经阅读了For a writeless transaction which is cheaper/quicker: COMMIT or ROLLBACK?,这与我的问题类似,但与 MS SQL Server 相关,并且已经很老了。此外,这个答案让我有些意外,所以我想知道 2018 年 MySQL 5.7 的情况如何。

话虽如此:

假设以下场景:

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

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

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

如果被锁定的行的比例总是可以忽略不计(例如 1/1e6 之类的),有人可以告诉我推荐哪种方法,并可能提供一些背景(或一些背景的链接)?

【问题讨论】:

  • COMMIT 和 ROLLBACK 如果想要查看 MySQL 源代码的答案,会做不同的事情。
  • 我有一个类似的问题,想知道您是否可以尝试一下,如果可以,结果如何?

标签: mysql transactions innodb


【解决方案1】:

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

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

您的使用不涉及任何实际更改,所以我会猜测性能相似。我可能会执行ROLLBACK 让未来的读者(包括你自己)清楚地知道“什么都没做”。

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

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

【讨论】:

  • 好的,谢谢,接受并 +1。我还没有决定是回滚还是提交,但很高兴知道它在性能方面可能大致相同。我提供的链接只是为了证明我在提问之前做过自己的研究:-) 我怀疑 MySQL 服务器和 MS SQL 服务器的行为会有所不同,这也是发布问题的原因之一。
猜你喜欢
  • 2016-10-04
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多