当前位置: 首页 > 图灵资讯 > 技术篇> Spring Boot集群环境下如何保证唯一编号生成?

Spring Boot集群环境下如何保证唯一编号生成?

来源:图灵教育
时间:2025-03-14 16:11:55
Spring Boot集群环境中唯一的ID生成策略:避免重复编号的有效方案

在分布式环境中生成唯一的id是一个常见的挑战。本文讨论了基于spring的spring boot + mybatis-plus的id生成方案,并分析id在集群环境中可能重复的原因和解决方案。该方案的核心是利用数据库序列与分布式锁定相结合(redisson)确保id的唯一性。

Spring 如何保证Boot集群环境中唯一的编号生成?

方案的核心逻辑:获取当前日期,查询数据库序列表中是否有相应日期的记录。如果存在并且日期相同,则增加序列号;否则,创建新记录。最后,更新数据库并返回生成的ID。

然而,即使使用Redison分布式锁,当地单机环境测试正常,ID重复也可能发生在集群环境中。问题的根源在于提交事务的时间。@Transactional(rollbackFor = Exception.class) 注释不能保证事务在方法执行后立即提交,Spring框架通常在方法执行或线程完成后提交。

在集群环境中,多个例子可以同时获得锁并执行ID生成方法。如果机器的时间差异很小,不同的例子可能会在事务提交前产生相同的日期,导致ID重复。分布式锁只能确保同时只有一个实例访问数据库,无法控制事务提交时间。

建议采用以下两种方法来解决这个问题:

方法一:使用 Propagation.REQUIRES_NEW

修改 @Transactional 注解,将 propagation 属性设置为 Propagation.REQUIRES_NEW。这将使ID生成方法在新事务中运行,并在方法结束后立即提交,以避免事务提交时间不一致。修改后的说明如下:

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)

方法二:使用 TransactionTemplate

更精细的控制方法是使用 TransactionTemplate 手动管理事务。TransactionTemplate 允许更准确地控制事务提交和回滚,确保ID生成方法在独立事务中执行,并在方法结束后立即提交。

通过以上两种方法,可以有效避免集群环境中ID的重复,确保分布式环境中生成的ID是唯一的。

以上是Spring 如何保证Boot集群环境中唯一的编号生成?详情请关注图灵教育的其他相关文章!