2012-07-31 89 views
1

我迷路下列關於數據存儲:數據存儲 - 在一個單一的實體組資源爭 -

  • 建議非規範化的數據作爲數據存儲不支持連接查詢。這意味着相同的信息在多個實體複製

  • 非規範化意味着,只要你有更新 數據,就必須在不同的實體

  • 更新,但有1個寫的限制/秒一個單一的實體組織。因此

我的問題是:

  • 爲了更新記錄,我打開一個交易然後

  • 更新所需的所有實體。要更新的實體是相同的實體組內,但涉及到不同種類的

  • 我得到一個「資源爭奪」異常

==>因此它似乎只有這樣才能更新非規格化數據在交易之外。但是這樣做非常糟糕,因爲有些實體可能會更新,而其他實體則不會。

我是唯一有這個問題的人嗎?你是如何解決它的?

謝謝,

格·

的代碼(簡化版本)如下:

Objectify ofy=ObjectifyService.beginTransaction(); 

try { 
    Key<Party> partyKey=new Key<Party>(realEstateKey, Party.class, partyDTO.getId()); 

    //-------------------------------------------------------------------------- 
    //-- 1 - We update the party 
    //-------------------------------------------------------------------------- 
    Party party=ofy.get(partyKey); 
    party.update(partyDTO); 

//--------------------------------------------------------------------------------------------- 
//-- 2 - We update the kinds which have Party as embedded field, all in the same entity group 
//--------------------------------------------------------------------------------------------- 

    //2.1 Invoices 

    Query<Invoice> q1=ofy.query(Invoice.class).ancestor(realEstateKey).filter("partyKey", partyKey); 
    for (Invoice invoice: q1) { 
     invoice.setParty(party); 
    ofy.put(invoice); 
    } 
    //2.2Payments 
    Query<Payment> q2=ofy.query(Payment.class).ancestor(realEstateKey).filter("partyKey", partyKey); 
    for (Payment payment: q2) { 
     payment.setParty(payment); 
    ofy.put(payment); 
    } 
} 

    ofy.getTxn().commit(); 
    return (RPCResults.SUCCESS); 
} 

catch (Exception e) {  
     final Logger log = Logger.getLogger(InternalServiceImpl.class.getName());  
     log.severe("Problem while updating party : " + e.getLocalizedMessage()); 
     return (RPCResults.FAILURE) ;  
} 

finally { 
    if (ofy.getTxn().isActive()) { 
     ofy.getTxn().rollback(); 
    partyDTO.setCreationResult(RPCResults.FAILURE); 
    return (RPCResults.FAILURE) ;   
    }    
} 
+0

您能否發佈錯誤的代碼和堆棧跟蹤? – mjibson 2012-07-31 17:19:17

+0

@mjibson堆棧跟蹤:com.plugimmo.web.server.internal.service.InternalServiceImpl requestUpdateLease:更新租約時出現問題:對這些數據存儲實體的爭用太多。請再試一次。 – Hugues 2012-07-31 17:33:57

+0

如果您發佈您的代碼,或許我們可以提供更多幫助。 – mjibson 2012-07-31 17:50:41

回答

1

以防萬一有人遇到同樣的問題。

問題出在party.update(partyDTO),在某些特定條件下,我正在啓動另一個事務。

我今天學到的是:

- >在事務內,你被允許包括多個甚至讓在越過1個實體/秒

- >但是,你要小心不在您的交易中啓動另一個交易

3

發生這種情況,因爲多個請求更新相同的實體組中的正在發生而不是因爲您一次更新同一實體組中的許多實體。

既然你還沒有表現出你的代碼,我可以假設兩種情況之一的發生:

  1. 你描述上面實際上並沒有使用事務的方法和你有相同的許多實體運行put_multi()實體組。 (如果我不得不猜測,就是這樣。)
  2. 您有一個高流量的網站和許多其他更新同時發生。
+0

對不起,我忘了添加我的代碼。您會在下面找到簡化版本: – Hugues 2012-07-31 18:05:27

+0

感謝您的幫助。非常感謝,Hugues – Hugues 2012-07-31 19:53:20

相關問題