如果事务中没有更改数据,则 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的情况如何。
话虽如此:
假设以下场景:
- 我是运行MySQL5.7.
- 我已关闭隐式事务。
- 我有一个 InnoDB table。
- 我
BEGIN
一笔交易。
- I
SELECT ... FOR UPDATE
锁定 table 中的几行(在大多数情况下,锁定一行)。
- 我检查了被选中/锁定的行并得出数据没有问题的结论,因此...
- ...我决定完全不更改被锁定行中的任何数据。
现在我想完成交易。我可以通过正常方式做到这一点,即通过发出 COMMIT
,在这种情况下,它只会删除锁,或者作为替代方案,通过发出 ROLLBACK
,在这种情况下也将只是删除锁。
这两种方法的结果应该是一样的,但我的感觉是在成本/性能上可能会有很大的差异。
如果被锁定的行的比例总是可以忽略不计(即类似 1/1e6),有人可以告诉我建议使用哪种方法,并可能提供一些背景信息(或 link一些背景)?
(警告:此答案是有根据的猜测,但可能是错误的。)
commit/rollback 的通常用法是实际进行更改,然后撤消它们。 InnoDB 是乐观的,因为它假定事务将被提交。也就是说,它最大限度地提高了进行更改(插入、更新等)的效率,而不是针对回滚进行优化。因此,ROLLBACK
比 COMMIT
更昂贵(有时 'much more')。潜在回滚的内容保存在撤消日志中,最终需要清理。但是此清理是在 'later' 完成的,而不是在用户等待 COMMIT
完成时完成的。
您的使用不涉及任何实际更改,因此我猜测性能相似。我可能会执行 ROLLBACK
让未来的读者(包括你自己)清楚 "nothing was done".
由于撤消操作的笨拙部分是行的旧副本,而您的情况不会生成此类内容,所以我看不出什么区别。
您的link指的是SQL服务器,可能有不同的算法。
免责声明:
我已经读过 For a writeless transaction which is cheaper/quicker: COMMIT or ROLLBACK?,这与我的问题类似,但与 MS SQL 服务器有关,而且很旧。另外,这个答案让我有点吃惊,所以我想知道2018年MySQL 5.7的情况如何。
话虽如此:
假设以下场景:
- 我是运行MySQL5.7.
- 我已关闭隐式事务。
- 我有一个 InnoDB table。
- 我
BEGIN
一笔交易。 - I
SELECT ... FOR UPDATE
锁定 table 中的几行(在大多数情况下,锁定一行)。 - 我检查了被选中/锁定的行并得出数据没有问题的结论,因此...
- ...我决定完全不更改被锁定行中的任何数据。
现在我想完成交易。我可以通过正常方式做到这一点,即通过发出 COMMIT
,在这种情况下,它只会删除锁,或者作为替代方案,通过发出 ROLLBACK
,在这种情况下也将只是删除锁。
这两种方法的结果应该是一样的,但我的感觉是在成本/性能上可能会有很大的差异。
如果被锁定的行的比例总是可以忽略不计(即类似 1/1e6),有人可以告诉我建议使用哪种方法,并可能提供一些背景信息(或 link一些背景)?
(警告:此答案是有根据的猜测,但可能是错误的。)
commit/rollback 的通常用法是实际进行更改,然后撤消它们。 InnoDB 是乐观的,因为它假定事务将被提交。也就是说,它最大限度地提高了进行更改(插入、更新等)的效率,而不是针对回滚进行优化。因此,ROLLBACK
比 COMMIT
更昂贵(有时 'much more')。潜在回滚的内容保存在撤消日志中,最终需要清理。但是此清理是在 'later' 完成的,而不是在用户等待 COMMIT
完成时完成的。
您的使用不涉及任何实际更改,因此我猜测性能相似。我可能会执行 ROLLBACK
让未来的读者(包括你自己)清楚 "nothing was done".
由于撤消操作的笨拙部分是行的旧副本,而您的情况不会生成此类内容,所以我看不出什么区别。
您的link指的是SQL服务器,可能有不同的算法。