2013-11-25 84 views
0

我在項目中使用JavaEE7和容器管理的事務。雖然我有@Transactional批註方法,我得到「交易必須運行」異常。 代碼看起來如下:@Transactional註釋java.lang.IllegalArgumentException:事務必須正在運行

@Transactional(Transactional.TxType.MANDATORY) 
public void myMethod(Project project) { 

    final ObjectIdentity objectId = new ObjectIdentityImpl(project); 
    final Sid sid = new PrincipalSid(SecurityContextHolder.getContext().getAuthentication()); 
    final Permission p = BasePermission.ADMINISTRATION; 
    MutableAcl acl = null; 
    try { 
     List<Sid> sids = new ArrayList<>(); 
     sids.add(sid); 
     acl = (MutableAcl) aclService.readAclById(objectId, sids); 

    } catch (Exception ex) { 
     acl = ((MutableAclService) aclService).createAcl(objectId); // This line causes exception 
    } 

    acl.insertAce(acl.getEntries().size(), p, sid, true); 
    aclService.updateAcl(acl); 
} 

缺什麼在此代碼,該交易不會開始?

親切的問候,

比拉爾

+0

我認爲交易開始,但春天不知道。有一種在TransactionSynchronizationManager中註冊事務的方法.'TransactionSynchronizationManager.registerSynchronization(TransactionSynchronization synchronization)'。我認爲交易沒有註冊。 – bilal

回答

3

Transactional.TxType.MANDATORY註釋方法需要一個已經運行的事務。這意味着當方法調用開始時,事務必須已經開始。您可以通過以另一種方法啓動事務來執行此操作,該方法調用使用Transactional.TxType.MANDATORY註釋的方法。

如果你想開始一個新的事務時,有正在運行的,你必須將交易類型設置爲Transactional.TxType.REQUIRED無交易(新交易將在沒有事務已運行過程中出現啓動)或Transactional.TxType.REQUIRES_NEW(新的事務將開始不管什麼) - 這取決於你的需求。 Transactional.TxType.REQUIRED類型是CDI中的默認交易類型,所以實際上您可以僅使用@Transactional而不指定任何類型。

請參閱http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.TxType.html瞭解更多信息

相關問題