Как я могу создать порядковый номер (как в ORACLE), используя MariaDB и Galera Cluster

Мне нужно иметь порядковый номер (не для первичного ключа и не auto_increment) в MariaDB с использованием Galera Cluster.

Я думал о наличии таблицы с именем последовательности, текущим значением и использованием хранимых процедур для возврата следующего значения.

Я не уверен, что Galera Cluster поддержит это ( http://www.sqlines.com/oracle-to-mysql/sequence):

CREATE FUNCTION NextVal (vname VARCHAR(30))
  RETURNS INT
BEGIN

UPDATE _sequences
  SET next = (@next := next) + 1
  WHERE name = vname;

  RETURN @next;
END

Это работает в моих тестах, но я не знаю, могу ли я гарантировать это. Должен ли я продолжать этот путь или я должен позаботиться об этом по-другому?

1 ответ

Любой метод, который включает в себя получение последовательных номеров в нескольких первичных (MM, Galera, InnoDB Cluster и т. д.), должен синхронно ожидать ответа от всех доступных для записи узлов, прежде чем предоставлять следующий порядковый номер. Это займет миллисекунды. Или дольше, если узлы географически далеко друг от друга.

Вы можете позволить себе такие задержки? Если вам не нужно больше, скажем, 100 новых номеров в секунду, то какой-то специальный механизм должен работать адекватно. С другой стороны, ваша хранимая функция кажется жизнеспособной для этого.

Обязательно проверяйте наличие ошибок даже наCOMMIT. Если вы зашли в тупик, повторите транзакцию.

Я предлагаю захватить «следующий» номер вне какой-либо транзакции, иначе время, затраченное на оставшуюся часть транзакции, остановит все остальные узлы.

Однако захват номера в собственной транзакции может привести к случаям, когда строка, использующая этот порядковый номер, будет доступна в каком-либо узле после получения следующего номера. То есть пункт 123, по-видимому, очень ненадолго отсутствует, хотя пункт 124 уже есть в таблице. Если это неприемлемо, нам нужно более сложное (и более медленное) решение.

(Я видел приложения с одним из двух упомянутых случаев. Я не знаю, какой из них относится к вашему приложению.)

Другие вопросы по тегам