Во-первых, помните, что (1) может быть только консультативным. То есть (1) может сказать «данные не существуют», но тогда (2) найдет, что данные там есть. Или это открытие не произойдет до тех пор, пока COMMIT
?
Пожалуйста, добавьте в свой список любые START TRANSACTION
и COMMIT
. Между тем, я предполагаю, что все 4 шага находятся в одной транзакции, хотя я бы предложил поместить (1) вне транзакции.
Насколько далеко (время пинга) находятся узлы? Если они находятся в одном здании, синхронизация может занять всего миллисекунды. (Я говорю « может », потому что 1K действий в секунду, вероятно, будет несколько стрессовым.)
Я думаю, что это может быть лучше:
(1) See if row exists -- 98% of the time, this will avoid doing the rest.
BEGIN;
(2), (3), (4); -- check after each step; 1% of collisions will be caught here
COMMIT; -- again check; still another 1% get caught here.
То есть отказаться от стремления к совершенству (один тест ловит 100%). Вместо этого, играйте в игру чисел так, чтобы вы обычно делали то, что вам нужно, а затем нередко выявляли нечетные случаи, чтобы заметно не повредить производительности.