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

本文关键字:返回 null 事务 Ormlite 读取 提交 | 更新日期: 2023-09-27 18:14:27

我们在自动化测试过程中遇到了一个奇怪的问题。有时,在提交之后读取数据会得到空返回值,即使数据已经提交到数据库。

代码:

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只处理需要嵌套的事务的开始和停止,但这只是一个块,没有嵌套的事务语句。

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

30 - 50%的呼叫失败。

有什么想法吗?

/Erik

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

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

/Erik