测试用例假设
我的 Java 或 C++ 应用程序运行在一个由 100 个虚拟计算组成的集群上。此应用程序的每个实例都会同时插入到 Galera 上的 MariaDB(100 个同时插入)
insert into test_table (id_col) values (1)
会发生什么?显然存在重复的主键违规。但这些 INSERT 语句中至少有一个会成功吗?有保证吗?可能出现死锁吗?
最佳答案
如果 100 个连接都在单个 Galera 节点上:
一个人就会成功;一个人就会成功;其余的将在 INSERT
上失败。
如果 100 个连接分布在您的 3 个(?)Galera 节点上:
在成功插入的节点上,其他节点将在 INSERT
上失败。
在其他节点上,COMMIT
会发生故障。
如果您使用 autocommit=ON
运行,则 INSERT
中有一个隐式 COMMIT
,所以失败看起来都是一样的。但是,某些详细状态可能会有所不同。
远程操作(在此节点上插入,但其他某个节点已提交该行)是乐观的,因此必须在 COMMIT
上捕获。
实际上,要让 100 个连接“同时”执行 INSERT
是非常困难的。我怀疑你是否能做到 10 次。在操作的几个阶段,互斥体被取出,从而在节点上短暂地进行单线程工作。启动连接的开销可能比微不足道的 INSERT
还要大。
此外,请记住,所有连接可能都通过单个以太网网络。这也往往会阻止您所期望的同时性。
能否保证其中一个INSERT
会成功?我想是这样。否则数据库引擎有什么用呢?生产系统已经在 InnoDB 上运行了大约 16 年。 Galera 已经生产了大约 6 年。丢失的INSERT
将是一个严重的错误,无论它是如何发生的。
关于mysql - MariaDB如何处理重复主键的同时插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52341169/