我有一個對象GeneralKnowledgeTest,它包含很多統計字段(ratingsCount,responsesCount,ratingStars ...),每更新一次用戶都會進行測試takeTest() - >事務性方法)。簡單的設計問題關於樂觀鎖定在spring/jpa/hibernate
這可能會發生,很多用戶正在以相同的時間相同的測試,所以我想實現一個樂觀鎖(@version)和重試takeTest方法情況下的樂觀鎖定異常被拋出AA攔截。
因此,在takeTest方法中,我總是得到一個新的GeneralKnowledgeTest實例, entityManager.find(testId),然後更新其統計字段。如果拋出一個樂觀的異常,攔截器將簡單地重試takeTest方法直到它成功。
您對此程序有什麼看法?對於可能有很多用戶試圖進行相同測試的系統,這是否是實現樂觀鎖定的好方法?
PS。業務不會承認顯示任何警告消息,以防樂觀鎖異常被拋出,因此攔截器是一個必須允許順利執行...
許多用戶很可能在同一時間內完成測試(如當天測試等)。我已經讀過樂觀鎖定在性能方面沒問題,所以沒有數據庫鎖定。 (設想100個用戶在同一時間內完成相同的測試,同時考慮takeTest是一個複雜的方法,創建許多額外的數據庫對象,使交易花費更長時間)。但是一般來說,我認爲這有什麼不妥之處?是否有任何錯誤或缺點?預先感謝您 – 2011-03-01 21:02:04
不,沒有錯誤。樂觀鎖定失敗將導致數據被重新讀取,但會增加數據庫負載,並且重做測試邏輯會增加CPU負載。這種方法沒有問題,只取決於您希望鎖定失敗的頻率。 – Will 2011-03-01 21:29:58