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

标签 mysql sql mariadb deadlock

测试用例假设

我的 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/

相关文章:

当参数为已知字符串时,PHP 数组到字符串的转换错误

mysql - 是否可以在 cPanel 上从 MySQL 5.5 迁移到 MariaDB 10?

mysql - 如何使用 MySql 的基于行的复制处理 DDL 语句(创建、更改、删​​除)?

php - 在 MySQL 中,如何选择包含我测试的每个值的结果?

mysql - SHOW ENGINE INNODB STATUS 缺少死锁部分

mysql - 如何最好地实现 3 维 SQL 关系?

mysql - 交叉表 - 252 个查询 - 优化

mysql - 局部变量和前面的列

php - MySQL 选择最近日期不在两个日期之间的位置

php - CodeIgniter 查询转义引号