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

Cost / performance of COMMIT vs. ROLLBACK if no data has been changed in the transaction

免责声明:

我已经读过 For a writeless transaction which is cheaper/quicker: COMMIT or ROLLBACK?,这与我的问题类似,但与 MS SQL 服务器有关,而且很旧。另外,这个答案让我有点吃惊,所以我想知道2018年MySQL 5.7的情况如何。

话虽如此:

假设以下场景:

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

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

如果被锁定的行的比例总是可以忽略不计(即类似 1/1e6),有人可以告诉我建议使用哪种方法,并可能提供一些背景信息(或 link一些背景)?

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

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

您的使用不涉及任何实际更改,因此我猜测性能相似。我可能会执行 ROLLBACK 让未来的读者(包括你自己)清楚 "nothing was done".

由于撤消操作的笨拙部分是行的旧副本,而您的情况不会生成此类内容,所以我看不出什么区别。

您的link指的是SQL服务器,可能有不同的算法。