pg如何不通过创建序列来实现字段值的自增长

背景:有一个需求,订阅产品失败,自动补三次,之前的逻辑是通过循环,失败就自动三次,客户觉得太快了,需要对补订的时间进行个性化设置,比如失败后,第一次补订在失败后的10分钟,第二次在失败后的20分钟,第三次补订在失败后的三十分钟。

解决方案:循环的次数n直接改成3,让其只循环一次,增加两个字段,一个用来记录是几次补丁,一个用来记录补订的时间,写一个定时任务扫描,补丁的时间超过当前时间的订单,再次进行补订的操作,如果失败就记录次数和下次补订的时间。

这时候就会出现一个问题,一条如果有多个线程操作,都失败的话,就有可能同时去更新补订次数的字段,这时候最好的方法就是让次数的字段进行自增的操作,不要通过sql去修改,这样就保证了原子性,不会出现意料之外的问题。

具体实现:
1.可以通过pg的序列来实现,但是序列一般用于主键的自增长,不是很合适
2.通过COALESCE 函数实现,COALESCE 函数用于从一组表达式中选择第一个非空的值。它接受多个参数,返回第一个非空参数的值,如果所有参数均为空,则返回 null。

SELECT COALESCE(表字段, 0) + 1 AS RESULT
FROM 表名 WHERE查询条件

这样就完美的实现了非主键字段自增长的问题

你可能感兴趣的:(数据库,pgsql,postgresql)