已解决了,原因是 hangfire.MysqlStorage 的 MySqlWriteOnlyTransaction.cs 中AddToSet 方法执行ON DUPLICATE KEY UPDATE 导致的,AddToSet 方法是每次执行任务时,会去检查HangfireSet表是否已有任务记录,有则更新下一次任务执行时间,他通过唯一约束索引作为条件来决定insert 或者 update,但不管是insert 还是 update,只要执行过,表的自增ID都会自行增加1;将AddToSet 方法改为如下代码,然后将hangfire.MysqlStorage改变版本号,生成DLL,将DLL引入到代码中替换hangfire.MysqlStorage的Nuget包,注意版本号要和hangfire.MysqlStorage的Nuget包的版本号一致; public override void AddToSet(string key, string value, double score) { Logger.TraceFormat("AddToSet key={0} value={1}", key, value); AcquireSetLock(); QueueCommand(x => { var editExec = x.Execute( $"UPDATE `{_storageOptions.TablesPrefix}Set` SET `Score` = @Score WHERE `Key` = @key and `Value` = @value", new { key, value, score }); if (editExec == 0) { x.Execute( $"INSERT INTO `{_storageOptions.TablesPrefix}Set` (`Key`, `Value`, `Score`) " + "VALUES (@Key, @Value, @Score) " + "ON DUPLICATE KEY UPDATE `Score` = @Score", new { key, value, score }); } }); }
已解决了,原因是 hangfire.MysqlStorage 的 MySqlWriteOnlyTransaction.cs 中AddToSet 方法执行ON DUPLICATE KEY UPDATE 导致的,AddToSet 方法是每次执行任务时,会去检查HangfireSet表是否已有任务记录,有则更新下一次任务执行时间,他通过唯一约束索引作为条件来决定insert 或者 update,但不管是insert 还是 update,只要执行过,表的自增ID都会自行增加1;
将AddToSet 方法改为如下代码,然后将hangfire.MysqlStorage改变版本号,生成DLL,将DLL引入到代码中替换hangfire.MysqlStorage的Nuget包,注意版本号要和hangfire.MysqlStorage的Nuget包的版本号一致;