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