一、场景
某表保存时,其自增ID需要同时作为其他表的外键同时保存,如果用MySql的自增ID,意味着只能分步操作,且出现异常时无法保证数据一致性,决定在代码中用AumicInteger实现自增ID,同时给多表用。
二、功能实现
因为是分布式,服务部署多个点,为保证ID的一致性,so将init的ID在数据库持久化,当然也可用redis或其他数据库或文件的方式,实质是一样的。
1、首先init当前ID及最大ID,并设定一次取ID的量,用完后再重新取;
private static AtomicInteger maxVal = new AtomicInteger(200000);
private static AtomicInteger currenVal = new AtomicInteger(200000);
//每次生成ID数量
private static final Integer FETCH_SIZE = 3;
2、获取自增ID,并将其持久化,直至与max相等
/**
* 获取自增ID序列
*/
public Integer nextId() {
//当前ID取完后,重新去DB取号段
if (currenVal.get() >= maxVal.get()) {
synchronized (this) {
if (currenVal.get() >= maxVal.get()) {