2011-03-15 143 views
2

基本問題,我是新來使用「樂觀鎖定」機制 - 我使用休眠(在JBoss中)和容器管理事務(CMT)。 我要處理的情景時,我實體讀實體更新之間別人在DB更新同一實體(即行)。 在這種情況下,我想拋出異常..樂觀鎖(休眠)

我有我的註釋與@Version實體 - 就像

@Version 
private Long version; 

現在,我很困惑,如果這是不夠的版本管理或我需要顯式調用 的EntityManager.lock()API等預先

{ 
    . 
    . 
    final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id); 
    entityManager.lock(queryDTO, LockModeType.READ); 
    queryDTO.setStatus(updatedStatus); 
    entityManager.persist(queryDTO); 
    } 

感謝,

回答

6

你並不需要顯式的鎖(p悲觀鎖定),通過@Version使用樂觀鎖定。當實體被更新到數據庫中,類似下面的查詢將發生:

UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99

如果更新失敗(人/別的東西已經改變了數據和版本),你會得到OptimisticLockException(由於您使用EntityManager的,我認爲這是關於JPA,在「原始」休眠也有可能是類似StaleStateException)。