2012-10-16 40 views
2

請參閱我的以下代碼片段。@Transactional不執行提交

@Transactional 
public void saveMembersService(List<Member> list1, List<Member> list2) 
{ 
    saveMembersDAO(list1); // does not perform commit. Why? 
    saveMembersDAO(list2); // does not perform commit. Why? 
} // does perform commit only here! 

@PersistenceContext 
private EntityManager em; 

@Transactional 
public void saveMembersDAO(List<Member> members) 
    throws HibernateException 
{ 
    Iterator<Member> it = members.iterator(); 
    while (it.hasNext()) 
    { 
     Member wsBean = it.next(); 
     em.persist(wsBean); // overall commit will be made after method exit 
    } 
} 

我使用MySQL作爲數據庫。我在上面的方法執行後觀察MySql日誌。但是我只能看到單個提交後saveMembersService方法執行。我期望看到爲每個事務性方法調用提供兩個提交。我錯在哪裏?

UPDATE 1:對不起,我忘了添加@Transactional到我的服務方法。現在固定

更新2:我已經與Propagation.REQUIRES_NEW屬性檢查DAO - 結果是相同的(具有和與出@Transactional在提供服務的方法)

回答

3

當使用@Transactional ,Spring會在你的類中創建一個代理,而在內部調用的方法不會傳入代理。

你必須這樣做。你可以通過在Spring上下文中創建TransactionTemplate來清除它。

@Autowired 
private PlatformTransactionManager transactionManager; 

public void saveMembersDAO(List<Member> members) 
    throws HibernateException 
{ 
    TransactionDefinition txDef = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
    TransactionTemplate txTemplate = new TransactionTemplate(transactionManager, trDef) 

    txTemplate.execute(new TransactionCallbackWithoutResult() { 

     @Override 
     protected void doInTransactionWithoutResult(TransactionStatus status) { 
      Iterator<Member> it = members.iterator(); 
      while (it.hasNext()) 
      { 
       Member wsBean = it.next(); 
       em.persist(wsBean); 
      } 
     } 
    }); 
} 

如果您使用的是AspectJ並且您想要提交2個提交。您必須在saveMembersDAO上使用@Transactional(propagation = Propagation.REQUIRES_NEW)

+0

請參閱我的更新。 –

+0

其實我已經檢查了DAO的Propagation.REQUIRES_NEW屬性 - 結果是一樣的(在服務方法下使用@Transactional) –

+0

你還只有一次提交嗎? –