免责声明:
我已经读过For a writeless transaction which is cheaper/quicker: COMMIT or ROLLBACK?,它与我的问题类似,但是与MS SQL Server有关,并且已经很老了。此外,答案使我有些惊讶,所以我想知道MySQL 5.7在2018年的情况如何。
已这样说:
假设以下情况:
BEGIN
进行交易。SELECT ... FOR UPDATE
锁定了表中的几行(大多数情况下,一行)。现在我想完成交易。我可以通过通常的方式来执行此操作,即通过发出COMMIT
(在这种情况下仅删除锁),或者通过发出ROLLBACK
(在这种情况下)也只会删除锁。
两种方法的结果是相同的,但我的感觉是成本/性能可能会有很大差异。
如果被锁定的行的分数始终可以忽略(例如1 / 1e6之类),并且可能给出一些背景(或指向某些背景的链接),有人可以告诉我推荐哪种方法?
答案 0 :(得分:1)
(注意:这个答案是有根据的猜测,但可能是错误的。)
提交/回滚的通常用法是实际进行更改,然后撤消更改。 InnoDB是乐观的,因为它假定事务将被提交。也就是说,它可以最大程度地提高更改(插入,更新等)的效率,而无需针对回滚进行优化。因此,ROLLBACK
比COMMIT
昂贵(有时“更多”)。潜在回滚的内容保存在撤消日志中,最终需要清理。但是此清除操作是“稍后”完成的,而不是在用户等待COMMIT
完成时进行的。
您的使用不涉及任何实际更改,因此我会猜测,其性能是相似的。我可能会执行ROLLBACK
,以向未来的读者(包括您自己)明确“什么都没做”。
由于撤消内容的笨拙部分是行的旧副本,并且您的情况不会生成行副本,因此我看不出有什么区别。
您的链接引用的是SQL Server,其中可能具有不同的算法。