在自動測試過程中,我們遇到了一個奇怪的問題。有時我們在提交之後讀取時會得到空的返回值,即使數據是按照它應該提交給數據庫的方式提交的。ServiceStack Ormlite事務在提交後讀取有時返回null
代碼:
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。
如果需要嵌套,Repository.TransactionBegin()和Repository.TransactionCommit的存儲庫代碼僅處理事務的啓動和停止,但這只是一個塊並且沒有嵌套事務語句。
我們已經嘗試在沒有存儲庫處理的顯式事務中運行它,結果相同。我們在數據庫上運行了一個分析器,我們看到提交在select語句之前完成,但仍然有時會返回null。如果我們設置了一個斷點(與真的等待相同),它會在我們跨過它時起作用。
30 - 50%的通話失敗。
有什麼想法嗎?
/埃裏克