最近项目开发需要一个订单号
需求:订单号包含年月日并且当日的订单依次递增
设计方案:
订单号设计成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(避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性)