ServiceStack Ormlite 事务在提交后读取 returns 有时为空

ServiceStack Ormlite transaction read after commit returns null sometimes

我们 运行 在自动化测试期间遇到了一个奇怪的问题。有时我们在提交后的读取中得到空值 return,即使数据已按应有的方式提交到数据库。

代码:

Repository.TransactionBegin();
        try
        {
            //Saves the HemUser
            Repository.SaveWithReferences(partyUserDb);
            // Save hpc-party relation with artifact
            Repository.SaveWithCredentials(hpcUserContext.ConvertTo<EconomyPartyRelationship>());
            Repository.SaveWithCredentials(hpcUserContext.ConvertTo<EconomyPartyRelHpcUser>());

            serviceCenterContexts.ForEach(a =>
            {
                Repository.SaveWithCredentials(a.ConvertTo<EconomyPartyRelationship>());
                Repository.SaveWithCredentials(a.ConvertTo<EconomyPartyRelServiceCenterUser>());
            });

            Repository.TransactionCommit();
            Console.WriteLine("leaving commit");
        }
        catch(Exception ex)
        {
            Repository.TransactionRollback();
            throw new HttpError(
                HttpStatusCode.PreconditionFailed,
                HemErrorCodes.FAILED_TO_CREATE_HEMUSER.ToString(),
                "Error creating HemUser. Ex: {0}".FormatWith(ex.Message));
        }
        Console.WriteLine(partyUserDb.Id);
        return FindUsersHelper.GetHpcContextUserById(dto.contextHpcId, partyUserDb.Id);

FindUsersHelper.GetHpcContextUserById 有时 return 为空,即使数据已提交并存在于数据库中。如果我们等待它会工作,但由于它应该是连续的,如果提交成功,它不应该 return null。

Repository.TransactionBegin() 和 Repository.TransactionCommit 的存储库代码仅在需要嵌套时处理事务的启动和停止,但这只是一个块并且没有嵌套事务语句。

我们已经尝试 运行在没有存储库处理的显式事务中使用它,结果相同。我们在数据库上有 运行 一个分析器,我们看到提交是在 select 语句之前完成的,但有时它 return 还是空的。如果我们设置一个断点(实际上与 wait 相同),当我们越过它时它会起作用。

30 - 50% 的调用失败。

有什么想法吗?

/埃里克

我们找到了这个问题的答案。这是一个日期时间精度问题。 Mysql 将秒数四舍五入,无论超过一秒的时间有多小,除非您定义精度。因此 2015-0828T22:02:34.1234 将四舍五入为 2015-0828T22:02:35,这是验证日期戳的永恒。

/埃里克