测试用例假设我的java或c++应用程序运行在一个由100台虚拟计算机组成的集群上。此应用程序的每个示例都会同时插入galera上的mariadb(100个同时插入)
insert into test_table (id_col) values (1)
会发生什么?显然存在重复主键冲突。但是这些insert语句中至少有一个会成功吗?有保证吗?死锁可能吗?
ntjbwcob1#
如果100个连接都位于单个galera节点上:一个人会成功;其余的都会失败 INSERT .如果在3(?)galera节点上吐出100个连接:在成功插入的节点上,其他节点将失败 INSERT .在其他节点上,故障将发生在 COMMIT .如果你和 autocommit=ON ,则有一个隐式的 COMMIT 在 INSERT ,所以失败看起来是一样的。但是,可能有一些细节状态是不同的。远程操作(在此节点上插入,但其他一些节点已经提交了行)是乐观的,因此必须在 COMMIT .实际上,要获得100个连接来完成一个任务是非常困难的 INSERT “同时”。我怀疑你能不能得到10个。在操作的几个阶段,互斥锁被取出,从而在节点上进行简单的单线程工作。启动一个连接的开销可能比这个微不足道的开销要大 INSERT .另外,请记住,所有连接可能都通过一个以太网。这也会像你所期望的那样防止同时发生。是否保证 INSERTs 会成功吗?我认为是这样。否则,数据库引擎有什么用?生产系统对innodb的冲击已经持续了大约16年。galera已经生产了6年了。迷路的 INSERT 不管它是怎么发生的,都会是一个严重的错误。
INSERT
COMMIT
autocommit=ON
INSERTs
1条答案
按热度按时间ntjbwcob1#
如果100个连接都位于单个galera节点上:
一个人会成功;其余的都会失败
INSERT
.如果在3(?)galera节点上吐出100个连接:
在成功插入的节点上,其他节点将失败
INSERT
.在其他节点上,故障将发生在
COMMIT
.如果你和
autocommit=ON
,则有一个隐式的COMMIT
在INSERT
,所以失败看起来是一样的。但是,可能有一些细节状态是不同的。远程操作(在此节点上插入,但其他一些节点已经提交了行)是乐观的,因此必须在
COMMIT
.实际上,要获得100个连接来完成一个任务是非常困难的
INSERT
“同时”。我怀疑你能不能得到10个。在操作的几个阶段,互斥锁被取出,从而在节点上进行简单的单线程工作。启动一个连接的开销可能比这个微不足道的开销要大INSERT
.另外,请记住,所有连接可能都通过一个以太网。这也会像你所期望的那样防止同时发生。
是否保证
INSERTs
会成功吗?我认为是这样。否则,数据库引擎有什么用?生产系统对innodb的冲击已经持续了大约16年。galera已经生产了6年了。迷路的INSERT
不管它是怎么发生的,都会是一个严重的错误。