我应该在更新之前使用选择来减少回滚吗?

时间:2015-07-10 16:53:53

标签: mysql performance transactions

我们假设您有一个带有计数器的项目表,该计数器计算每个项目的数量。使用此表,您需要检查是否有项目A和项目B中的两项,如果有,则减少计数器。如果你没有足够的两件物品都不会被触及。

最佳解决方案是什么?

解决方案1 ​​

启动交易并尝试更新计数为> =所需金额的表格。如果其中一个查询没有更新某些内容,请使用rollback。

解决方案2

首先使用select来检查是否所有项目都在那里,然后按照解决方案1进行操作。

什么是最佳解决方案?

虽然解决方案1是最干净的解决方案,但我仍然担心InnoDB的回滚性能,因为它不是那么好。解决方案1不使用选择,因此当所有项目确实存在时,它显然是最佳解决方案。

但是,如果我们谈论的是一百件物品和一个高失败率(没有足够的一些物品)呢?通过首先选择检查项目是否存在,如果缺少项目并且可以跳过回滚,则不必运行更新。

在这种需要更新大量内容的情况下,您认为最佳解决方案是什么,但它是全部还是全部,而且结果往往是什么? 1,2或其他什么,为什么?

2 个答案:

答案 0 :(得分:0)

使用解决方案2.回滚旨在用于从意外故障中恢复,而不是作为正常处理的一部分。

答案 1 :(得分:0)

SELECT item_id, COUNT(*) AS ct FROM tbl GROUP BY item_id;

将在一个声明中为您提供所有计数。

同样对另一个陈述,然后

  • 处理代码中的列表,或
  • 构建一个复杂的UPDATE,它使用这两个SELECT作为子查询。

由于你没有说明计数器的位置等,我不能更具体。