我们有一个服务,它从Kafka收集和聚合数据,然后通过多行插入将其插入MySQL,其中有一些值是唯一键的一部分,因此如果这些值匹配,它只更新非键值,语句如下所示:
INSERT INTO table (c1, c2, c3, c4, c5, c6, c7, c8) VALUES
(?,?,?,?,?,?,?,?),
(?,?,?,?,?,?,?,?),
(?,?,?,?,?,?,?,?),
...
ON DUPLICATE KEY UPDATE c6 = VALUES(c6), c7 = VALUES(c7), c8 = VALUES(c8)
我的问题是:是否值得将此语句 Package 到事务中?我知道如果是多个INSERT语句,那么这样做是有意义的,但如果是单个多行语句,情况又会怎样?它不是隐式 Package 的吗?一行插入失败,但其他行可以成功吗?(重要的是,要么所有行都被插入/更新,要么一行都不被插入/更新)
MySQL服务器:
Server version: 8.0.29-21.1 Percona XtraDB Cluster (GPL), Release rel21, Revision 250bc93, WSREP version 26.4.3
1条答案
按热度按时间vc9ivgsu1#
如果您只运行一条
INSERT
语句,则不需要事务。在MySQL中,一条语句是原子语句,它要么完全执行,要么根本不执行,即使它是一条插入多行的INSERT
语句。这在docs:默认情况下,MySQL运行时启用了自动提交模式。这意味着,当不在事务中时,每个语句都是原子的,就像它被START TRANSACTION和COMMIT包围一样。您不能使用ROLLBACK来撤消效果;但是,如果在语句执行期间发生错误,则语句将回滚。
但是,如果有可能一次要插入多行,则在执行此类插入操作时应谨慎。您可能会达到MySQL服务器的
max_allowed_packet
限制。如果代码中的其他地方没有限制一次插入的行数,则可能需要考虑使用批处理。