【问题标题】: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 将是一个严重的错误,无论它是如何发生的。

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2016-06-26
      • 2022-01-03
      • 2012-05-06
      • 1970-01-01
      • 2018-09-19
      • 2014-10-20
      • 2018-02-22
      • 2018-08-11
      相关资源
      最近更新 更多