Как MariaDB обрабатывает одновременные вставки дубликата первичного ключа - PullRequest
0 голосов
/ 15 сентября 2018

Гипотетический тестовый пример

Мое приложение на Java или C ++ работает на кластере, скажем, 100 виртуальных вычислений.Каждый экземпляр этого приложения делает одновременную вставку в MariaDB на Galera (100 одновременных вставок)

insert into test_table (id_col) values (1) 

Что произойдет?Очевидно, есть нарушение первичного ключа дубликата.Но будет ли хотя бы одно из этих утверждений INSERT успешным?Это гарантировано?Возможен ли тупик?

1 Ответ

0 голосов
/ 05 октября 2018

Если все 100 соединений находятся на одном узле Galera:

Одно будет успешным;остальные не удастся выполнить на INSERT.

. Если 100 подключений распределены между вашими 3 (?) узлами Galera:

На узле, где происходит успешная вставка, другие не смогут работатьINSERT.

На других узлах сбой произойдет на COMMIT.

Если вы работаете с autocommit=ON, то существует неявное COMMIT в INSERT, поэтому сбои будут казаться одинаковыми.Тем не менее, могут быть некоторые подробности состояния, отличающиеся.

Удаленные действия (вставка на этот узел, но на каком-то другом узле уже есть зафиксированная строка) являются оптимистичными, поэтому их нужно поймать на COMMIT.

В действительности, очень трудно получить 100 соединений, чтобы сделать INSERT «одновременно».Я сомневаюсь, что вы могли бы даже 10, чтобы это произошло.На нескольких этапах операции мьютексы удаляются, тем самым кратко однопоточную работу на узле.И издержки на запуск соединения, вероятно, больше, чем тривиальные INSERT.

Кроме того, имейте в виду, что все соединения, вероятно, проходят через одну сеть Ethernet.Это также имеет тенденцию предотвращать столько одновременности, сколько вы ожидали.

Гарантируется ли, что один из INSERTs будет успешным?Я думаю так.Иначе, что хорошего в двигателе базы данных?Производственные системы стучатся в InnoDB около 16 лет.Galera была в производстве, возможно, 6 лет.Потерянный INSERT будет критической ошибкой, независимо от того, как она произошла.

...