2012-07-03 76 views
0

我有一個SLSB在實體中增加一個數字。如果兩個線程同時到達SLSB,那麼兩個請求中的數字都是相同的。如何避免無狀態會話Bean的併發性?

SLSB提取

@Stateless(mappedName = "ejb/CustomerManager") 
public class CustomerManagerBean implements CustomerManager { 
... 
    public String recoverName(int id) { 
     Customer customer = (Customer) em.createQuery("from Customer where id = :id").setParameter("id", id).getSingleResult();  
     int oldValue = customer.getValue(); 
     int newValue = oldValue + 1; 
     customer.setValue(newValue);   
    [BP] return customer.getName() + " value=" + customer.getValue(); 
    } 
... 
} 

實體提取

@Entity 
public class Customer implements Serializable { 
    @Id 
    private int id; 
    private int value; 
} 

要測試的問題,我在標有在SLSB recoverName方法[BP]行一個斷點。然後,從兩個分離的瀏覽器頁面進行兩個調用。在斷點處,值爲兩個調用的相同的

當第二次調用試圖用setter修改值時,不應該拋出某種異常嗎?

我使用JBoss 5作爲AS和MySQL或Oracle作爲DB(既試過)

感謝您的幫助

回答

4

你會在同步的時候,如果你增加了一個得到一個異常@Version註釋字段到您的實體,這將由JPA用於樂觀鎖定。

每次JPA更新實體時,它都會將內存中的版本與數據庫中的版本進行比較,如果它們不匹配,則會引發異常。如果它們匹配,版本會增加。

只需添加以下到您的實體:

@Column(name = "version") 
@Version 
private long version; 

(以及相應的列添加到數據庫中,當然)

+0

它完美!非常感謝你!! – Emiliano

相關問題