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