最近项目开发需要一个订单号

需求:订单号包含年月日并且当日的订单依次递增

设计方案:

订单号设计成14位,前面八位年月日加上后面六位自增序列

如:20201120000001

实现:

数据库新建sequence_info表,其中有三个字段name(序列的名称)、current_value(当前序列)、step(步长)

select * from sequence_info for update

获取序列的sql,加上 for update是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性。他会等待行锁释放之后,返回查询结果。

 

在生成订单的方法上加上事务

@Transactional(propagation = Propagation.REQUIRES_NEW)
浅谈订单号设计思路及实现

注意事项:

1.事务要设置成 Propagation.REQUIRES_NEW( 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务)

2.得到当前序列之后 要重新设置新的序列(当前序列+步长)

sequenceDO.setCurrentValue(sequenceDO.getCurrentValue() + sequenceDO.getStep());

3.查询的序列的sql加上for update(避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性)

相关文章: