Mysql MariaDB如何处理重复主键的同时插入

Mysql MariaDB如何处理重复主键的同时插入,mysql,sql,mariadb,deadlock,Mysql,Sql,Mariadb,Deadlock,测试用例假设 我的java或C++应用程序运行在一个集群上,比如说100个虚拟计算。此应用程序的每个实例在Galera上同时插入MariaDB(100个同时插入) 会发生什么?显然存在重复的主键冲突。但是,这些INSERT语句中至少有一个会成功吗?有保证吗?死锁可能吗 如果100个连接都位于单个Galera节点上: 一个会成功;其余的将在插入时失败 如果在3(?)Galera节点上吐出100个连接: 在成功插入的节点上,其他节点将在插入时失败 在其他节点上,将在COMMIT上发生故障 如果运行时

测试用例假设

我的java或C++应用程序运行在一个集群上,比如说100个虚拟计算。此应用程序的每个实例在Galera上同时插入MariaDB(100个同时插入)


会发生什么?显然存在重复的主键冲突。但是,这些INSERT语句中至少有一个会成功吗?有保证吗?死锁可能吗

如果100个连接都位于单个Galera节点上:

一个会成功;其余的将在插入时失败


如果在3(?)Galera节点上吐出100个连接:

在成功插入的节点上,其他节点将在插入时失败

在其他节点上,将在
COMMIT
上发生故障

如果运行时使用的是
autocommit=ON
,则在
INSERT
中有一个隐式的
COMMIT
,因此失败似乎是相同的。但是,可能存在一些不同的详细状态

远程操作(在此节点上插入,但其他一些节点已提交行)是乐观的,因此必须在
提交中捕获

实际上,很难让100个连接“同时”执行
插入操作。我怀疑你是否能得到10个。在操作的几个阶段,互斥锁被取出,从而在节点上进行简单的单线程工作。而且启动连接的开销可能比简单的
INSERT
要大

此外,请记住,所有连接可能都通过一个以太网网络。这也会像你所期望的那样防止同时发生

是否保证其中一个
插入将成功?我认为是这样。否则,数据库引擎有什么好处?大约16年来,生产系统一直在冲击InnoDB。Galera已经投入生产大约6年了。一个丢失的
INSERT
将是一个关键的bug,无论它是如何发生的

insert into test_table (id_col) values (1)