如何使用MariaDB和Galera Cluster创建序列号(如在ORACLE中)

p1iqtdky  于 2022-11-08  发布在  Oracle
关注(0)|答案(1)|浏览(175)

我需要在使用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

它在我的测试中有效,但我不知道我是否能保证这一点。我应该继续这条路,还是应该用另一种方式来处理这一点?

9udxz4iz

9udxz4iz1#

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

相关问题