You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM+PostgreSQL中created_at晚于updated_at异常求助

TypeORM CreateDateColumn/UpdateDateColumn 出现 updated_at 早于 created_at 的异常(PostgreSQL)

问题背景

我们使用TypeORM的CreateDateColumn和UpdateDateColumn装饰器维护交易表的时间字段,数据库采用PostgreSQL,全程未手动更新这两个字段,完全依赖TypeORM自动处理。

业务流程为:用户发起提现请求→扣除钱包余额→创建状态为「待处理」的交易记录→调用外部银行网关→根据响应更新交易状态为成功/失败。

异常现象

每10万笔交易中会出现1-2次异常:更新交易状态后,updated_at时间戳早于created_at,示例数据如下:

created_Atupdated_At
2024-07-12 21:49:00.2876822024-07-12 21:48:52.583741
2024-07-11 15:03:07.3205782024-07-11 15:03:02.978098

可能原因

  1. 应用与数据库时钟不一致:如果应用部署在多台服务器,某台服务器的本地时钟慢于数据库服务器,TypeORM更新updated_at时使用应用本地时间,就会比数据库生成的created_at(数据库本地时间)更早。
  2. 事务提交延迟:创建交易记录时,created_at由数据库端生成,但事务因网络或锁等待延迟提交;而更新请求的updated_at由应用端提前生成,导致最终入库的updated_at早于created_at。
  3. TypeORM版本bug:部分旧版本TypeORM在高并发场景下,可能存在时间戳复用、生成逻辑异常的问题,导致时间字段值异常。

解决方案

  1. 统一由数据库生成时间字段
    把两个时间字段都配置为PostgreSQL端生成,彻底规避应用与数据库的时间差问题:
    import { Column, CreateDateColumn, UpdateDateColumn } from "typeorm";
    
    // 交易实体示例
    export class Transaction {
      // ...其他字段
    
      @CreateDateColumn({
        type: "timestamp",
        default: () => "CURRENT_TIMESTAMP",
        update: false // 禁止更新
      })
      createdAt: Date;
    
      @UpdateDateColumn({
        type: "timestamp",
        default: () => "CURRENT_TIMESTAMP",
        onUpdate: "CURRENT_TIMESTAMP" // 更新时触发数据库生成当前时间
      })
      updatedAt: Date;
    }
    
  2. 同步服务器时钟
    为所有应用服务器和数据库服务器配置NTP服务,强制同步到同一权威时间源,避免单台服务器时钟偏移。
  3. 升级TypeORM到稳定版
    检查当前TypeORM版本,升级到最新稳定版,修复已知的时间字段相关bug。
  4. 增加更新前校验
    在更新交易状态的逻辑中,增加时间校验:如果当前应用生成的时间早于交易记录的createdAt,则主动调用数据库的CURRENT_TIMESTAMP获取时间后再执行更新,避免写入异常时间。

内容的提问来源于stack exchange,提问作者Aashutosh Mundra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:41:00