Sequelize increment调用如何同步更新updated_at字段
Sequelize 单次increment调用同步更新updated_at的方案
不需要分两次发起数据库请求,Sequelize原生支持在单条SQL中同时完成字段值递增和updated_at更新,既没有额外性能开销,也能保证操作原子性。
具体实现方式
推荐方案:使用内置
touch参数
Sequelize v5及以上版本的increment、decrement方法都支持touch配置项,传入true后,执行递增操作时会自动将updated_at更新为当前时间,全程只生成一条UPDATE语句,不会产生额外查询。示例代码:await account.increment( ["balance"], { by: updateAmount, transaction: transaction, touch: true } );如果你的模型自定义了
updated_at字段名,该参数会自动读取模型的时间戳配置,不需要额外适配。自定义时间值方案:直接在increment选项中传入字段赋值
如果你需要把updated_at设置为指定时间而非当前时间,也不需要额外调用update方法,直接在increment的配置对象中写入目标字段值即可,同样是单条SQL执行:await account.increment( ["balance"], { by: updateAmount, transaction: transaction, updated_at: new Date("2024-05-20 12:00:00") } );
补充说明
你在increment专属文档章节没找到对应说明,是因为touch属于模型时间戳能力的通用配置项,没有单独放在increment方法的专属API说明里。你当前使用的两次调用写法不仅多一次数据库IO开销,在事务隔离级别较低的场景下还可能出现余额更新成功但时间戳更新失败的不一致问题,替换为上述单调用写法即可。
内容的提问来源于stack exchange,提问作者leo_cape
相关产品推荐
相关产品推荐

