DatabaseGeneratedOption.Identity自增序号偶发跳1000的调试方向求助
SQL Server Identity列固定跳增1000排查方向
对应实体模型定义
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key] public string Id { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int OrderNumber { get; set; }
排查优先级
期望OrderNumber按步长1自增,但出现固定跳增1000的异常,可按以下顺序排查:
- 优先排查SQL Server identity cache配置
固定跳增1000是SQL Server身份验证缓存机制的典型特征:SQL Server默认会为int类型的Identity列预分配1000个值作为缓存,当数据库服务重启、进程异常终止、实例故障切换时,未使用完的缓存值会被直接丢弃,下一次分配就会从新的批次起始值开始,就会出现跳1000的情况。
排查方法:在数据库中执行命令DBCC TRACESTATUS(-1, 272),如果跟踪标记272未开启,说明identity缓存处于启用状态,基本可确定是该问题导致。
修复方案:如果业务对序列连续性要求很高,可开启跟踪标记272关闭identity缓存,缺点是会轻微降低大批量插入数据的性能。 - 检查Identity列基础配置
执行SQL命令SELECT IDENT_SEED('你的表名'), IDENT_INCR('你的表名')查看对应表的Identity配置,确认步长没有被错误设置为1000,种子值符合预期。 - 排查业务代码逻辑
检查是否存在事务回滚、批量插入失败的场景:Identity值一旦分配就算事务回滚也不会回收,也会出现断号,但该场景通常不会出现固定跳1000的规律,可作为次要排查项。 - 确认部署架构
如果是多数据库实例、读写分离架构,确认是否存在多个写入节点操作同一张表的情况,该场景的跳值通常没有固定步长,可放在最后排查。
内容的提问来源于stack exchange,提问作者mgPePe
相关产品推荐
相关产品推荐

