mysql 是否值得将多行INSERT Package 到事务中

qjp7pelc  于 2023-01-08  发布在  Mysql
关注(0)|答案(1)|浏览(110)

我们有一个服务,它从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
vc9ivgsu

vc9ivgsu1#

如果您只运行一条INSERT语句,则不需要事务。在MySQL中,一条语句是原子语句,它要么完全执行,要么根本不执行,即使它是一条插入多行的INSERT语句。这在docs
默认情况下,MySQL运行时启用了自动提交模式。这意味着,当不在事务中时,每个语句都是原子的,就像它被START TRANSACTION和COMMIT包围一样。您不能使用ROLLBACK来撤消效果;但是,如果在语句执行期间发生错误,则语句将回滚。
但是,如果有可能一次要插入多行,则在执行此类插入操作时应谨慎。您可能会达到MySQL服务器的max_allowed_packet限制。如果代码中的其他地方没有限制一次插入的行数,则可能需要考虑使用批处理。

相关问题