提交后读取的ServiceStack Ormlite事务有时会返回null

时间:2015-09-25 09:32:19

标签: c# mysql transactions servicestack ormlite-servicestack

我们在自动化测试期间遇到了一个奇怪的问题。有时我们在提交后获得读取的空返回,即使数据是应该提交给数据库的。

代码:

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有时会返回null,即使数据已提交并存在于数据库中。如果我们做一个等待它会工作,但因为它应该是所有顺序的,如果提交成功,它不应该能够返回null。

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

我们已经尝试在显式事务中运行它而没有使用相同结果的存储库处理。我们在数据库上运行了一个分析器,我们看到提交在select语句之前完成,但有时它仍然返回null。如果我们设置一个断点(与实际等待相同),当我们跨过它时它将起作用。

30 - 50%的通话失败。

有任何想法吗?

/埃里克

1 个答案:

答案 0 :(得分:1)

我们找到了答案。这是一个日期时间精度问题。除非你定义你的精确度,否则Mysql会将秒数逐渐增加,无论时间超过一秒。因此,2015-0828T22:02:34.1234将向上舍入到2015-0828T22:02:35,这对于验证日期戳来说是永恒的。

/埃里克