mariadb如何处理重复主键的同时插入

iqih9akk  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(361)

测试用例假设
我的java或c++应用程序运行在一个由100台虚拟计算机组成的集群上。此应用程序的每个示例都会同时插入galera上的mariadb(100个同时插入)

insert into test_table (id_col) values (1)

会发生什么?显然存在重复主键冲突。但是这些insert语句中至少有一个会成功吗?有保证吗?死锁可能吗?

ntjbwcob

ntjbwcob1#

如果100个连接都位于单个galera节点上:
一个人会成功;其余的都会失败 INSERT .
如果在3(?)galera节点上吐出100个连接:
在成功插入的节点上,其他节点将失败 INSERT .
在其他节点上,故障将发生在 COMMIT .
如果你和 autocommit=ON ,则有一个隐式的 COMMITINSERT ,所以失败看起来是一样的。但是,可能有一些细节状态是不同的。
远程操作(在此节点上插入,但其他一些节点已经提交了行)是乐观的,因此必须在 COMMIT .
实际上,要获得100个连接来完成一个任务是非常困难的 INSERT “同时”。我怀疑你能不能得到10个。在操作的几个阶段,互斥锁被取出,从而在节点上进行简单的单线程工作。启动一个连接的开销可能比这个微不足道的开销要大 INSERT .
另外,请记住,所有连接可能都通过一个以太网。这也会像你所期望的那样防止同时发生。
是否保证 INSERTs 会成功吗?我认为是这样。否则,数据库引擎有什么用?生产系统对innodb的冲击已经持续了大约16年。galera已经生产了6年了。迷路的 INSERT 不管它是怎么发生的,都会是一个严重的错误。

相关问题