如果交易中未更改任何数据,则COMMIT与ROLLBACK的成本/性能

时间:2018-09-24 17:42:09

标签: mysql transactions innodb

免责声明:

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

已这样说:

假设以下情况:

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

现在我想完成交易。我可以通过通常的方式来执行此操作,即通过发出COMMIT(在这种情况下仅删除锁),或者通过发出ROLLBACK(在这种情况下)也只会删除锁。

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

如果被锁定的行的分数始终可以忽略(例如1 / 1e6之类),并且可能给出一些背景(或指向某些背景的链接),有人可以告诉我推荐哪种方法?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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