【问题标题】:How does MariaDB handle simultaneous inserts of duplicate primary keyMariaDB如何处理重复主键的同时插入
【发布时间】:2019-02-19 19:26:10
【问题描述】:
假设的测试用例
我的任何 Java 或 C++ 应用程序都运行在一个由 100 个虚拟计算组成的集群上。此应用程序的每个实例都会同时 INSERT 到 Galera 上的 MariaDB(100 次同时插入)
insert into test_table (id_col) values (1)
会发生什么?显然存在重复的主键违规。但是这些 INSERT 语句中至少有一个会成功吗?有保障吗?有可能出现死锁吗?
【问题讨论】:
标签:
mysql
sql
mariadb
deadlock
【解决方案1】:
如果 100 个连接都在一个 Galera 节点上:
一个人会成功;其余的将在INSERT 上失败。
如果 100 个连接分布在您的 3(?) Galera 节点上:
在成功插入的节点上,其他节点会在INSERT上失败。
在其他节点上,COMMIT 将发生故障。
如果您使用autocommit=ON 运行,那么INSERT 中有一个隐式 COMMIT,因此故障似乎是相同的。但是,可能会有一些不同的详细状态。
远程操作(在此节点上插入,但某些其他节点已经提交了行)是乐观的,因此必须在 COMMIT 上捕获。
实际上,要获得 100 个连接来“同时”进行INSERT 是非常困难的。我怀疑你是否能达到 10 次。在操作的几个阶段,互斥体被取出,从而在节点上简单地进行单线程工作。而且启动连接的开销可能比那微不足道的INSERT 更大。
另外,请记住,所有连接都可能通过单个以太网网络。这也往往会阻止尽可能多的同时性。
是否保证INSERTs 之一会成功?我想是这样。不然数据库引擎有什么用?生产系统已经在 InnoDB 上运行了大约 16 年。 Galera 已经生产了大约 6 年。丢失的INSERT 将是一个严重的错误,无论它是如何发生的。