【发布时间】:2015-09-25 09:32:18
【问题描述】:
我们在自动化测试期间遇到了一个奇怪的问题。有时我们会在提交后读取返回空值,即使数据按照应有的方式提交到数据库。
代码:
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% 的调用失败。
有什么想法吗?
/埃里克
【问题讨论】:
标签: c# mysql transactions servicestack ormlite-servicestack