2015-09-25 60 views
0

在自動測試過程中,我們遇到了一個奇怪的問題。有時我們在提交之後讀取時會得到空的返回值,即使數據是按照它應該提交給數據庫的方式提交的。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%的通話失敗。

有什麼想法嗎?

/埃裏克

回答

1

我們發現這個問題的答案之一。這是一個日期時間精度問題。除非你定義了精確度,否則Mysql無論多麼小的時間部分超過秒鐘,都會輪到秒數。因此,2015-0828T22:02:34.1234將被取整至2015-0828T22:02:35,這是驗證日期戳的永恆。

/Erik