是否会增加在我们的应用程序中围绕每个服务方法放置数据库事务的开销?
我们目前只使用数据库交易,这是明确/显而易见的必要条件。我最近建议围绕所有服务方法进行交易 ,但其他一些开发人员问了一个谨慎的问题:这会增加开销吗?
我的感觉不是 - 自动提交与数据库视角的事务相同。但这是准确的吗?
DB:MySQL
答案 0 :(得分:3)
你是对的,自动提交每个语句都包含在事务中。如果您的服务方法正在执行多个sql语句,那么将它们包装到事务中会很好。有关详细信息,请查看this答案,here是关于此主题的精彩博文。
回答你的问题,是的,事务确实增加了性能开销,但在你的特定情况下,你不会注意到差异,因为你已经启用了自动提交,除非你在服务方法中有长时间运行的语句,这将导致更长的时间锁定参与事务的表。如果你只是将多个语句包装在一个事务中,你将获得一个事务(而不是每个单独语句的事务),如指向here(“启用了自动提交的会话可以通过启动来执行多语句事务它有一个显式的START TRANSACTION或BEGIN语句,并以COMMIT或ROLLBACK语句“)结束它,你将在服务方法级别实现原子性......
最后,我会选择你的解决方案,如果从服务方法级别上实现原子性的角度来看是有意义的(我认为你想要实现),但是对性能有+和 - 的影响,取决于您的查询,请求等...
答案 1 :(得分:0)
是的,他们可以增加开销。将交易隔离开来所需的额外“簿记”可能会变得很重要,特别是如果交易持续很长时间。
答案 2 :(得分:0)
简短的回答是它取决于你的桌子类型。如果你使用默认的MyISAM,那么确实没有交易,所以应该对性能没有影响。
但你应该使用它们。没有交易,就没有划分工作。如果您升级到InnoDB或像PostgreSQL这样的真实数据库,您仍然希望将这些交易添加到您的服务方法中,所以您现在也可以养成习惯,而不会花费任何成本。
此外,您应该已经在使用事务存储。如果服务方法目前失败,您如何清理?如果您将一些信息写入数据库,然后您的服务方法抛出异常,您如何清除不完整或错误的信息?如果您正在使用事务,则不必 - 数据库会丢弃回滚数据。或者,如果我在某个方法中途,另一个请求进入并找到我的半写数据,你会怎么做?当它寻找另一半不存在的时候它会爆炸吗?事务数据存储将为您处理:您的事务将彼此隔离,因此没有其他人可以看到部分写入的事务。
与数据库的所有内容一样,唯一明确的答案将来自使用真实数据和实际负载进行测试。无论您怀疑什么,我建议您始终这样做,因为当涉及到数据库时,当数据较大而不是数据时,会激活不同的代码路径。但我强烈怀疑使用InnoDB进行交易的成本并不高。毕竟,这些系统每天都在不断地被大大小小的组织大量使用,这些组织依赖于交易表现良好。 MVCC增加了很少的开销。好处是巨大的,成本很低 - 使用它们!