我需要在使用Galera集群的MariaDB中有一个序列号(不是主键也不是auto_increment)。
我在考虑有一个表,其中包含序列名、当前值,并使用存储过程返回下一个值。
我不确定Galera集群是否支持此功能(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条答案
按热度按时间9udxz4iz1#
任何涉及在多主节点(M-M、Galera、InnoDB集群等)中获取 * 连续 * 编号的技术,* 必须 * 同步等待所有可写节点回复,然后才能提供下一个序列号。这将花费毫秒。如果节点在地理位置上相距很远,则需要更长时间。
你能承受这样的延迟吗?如果你每秒不需要超过100个新数字,那么一些特别的机制就足够了。
即使在
COMMIT
上,也要确保检查错误。如果出现死锁,请重放事务。我建议在任何事务之外获取“下一个”号码,否则事务的其余部分所花费的时间将使所有其他节点停滞。
但是,在它自己的事务中获取编号可能会导致这样的情况:* 使用 * 该序列号的行 * 在 * 下一个编号到达之后 * 在某个节点中可用。也就是说,即使124已经在表中,项123似乎 * 非常短暂地 * 丢失。如果这是不可接受的,我们需要一个更复杂(和更慢)的解决方案。
(我看过上面提到的两种情况中的任何一种的应用程序。我不知道哪一种适用于您的应用程序。)