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,这是验证日期戳的永恒。
/埃里克
我们 运行 在自动化测试期间遇到了一个奇怪的问题。有时我们在提交后的读取中得到空值 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,这是验证日期戳的永恒。
/埃里克