2015-11-12 40 views
0

我有一個服務類象下面這樣:Spring的事務傳播 - 服務VS DAO

@Service("MyService") 
public class MyService { 
    @Autowired 
    MyDao dao; 

    public void process() { 
     getFromDao(); 
     // getMoreFromDao(); 
     // process(); 
     // if all good, then 
     doStuff(); 
    } 

    public void getFromDao() { 
     // do some stuff 
     dao.getData(); 
    } 

    @Transactional(transactionManager="simpleDatasourceTxMgr", propagation=Propagation.REQUIRED) 
    public void doStuff() { 
     dao.saveData(1); 
     dao.saveData(2); 
     dao.saveData(3); 
    } 
} 

的DAO稱爲是:

@Repository 
public class MyDao { 

    @Autowired 
    @Qualifier("myjdbcTemplate") 
    NamedParameterJdbcTemplate jdbcTemplate; 

    public void saveData(obj a) { 
     jdbcTemplate.execute("Query", ...); 
    } 
} 

我想我在服務類doStuff()方法內運行如果在saveData()方法中存在異常,則處理事務並回滾所有內容。但是這不是在交易中運行。

如果我將@Transaction添加到DAO方法看起來像它在單獨的事務中運行。它是否正確?

更新:我添加了一個process()方法來我的服務,我打電話從process()getFromDao()doStuff()。從控制器調用process()。因此,看起來如果我使服務類@Transactional,然後一切都在一個事務中執行。但我不希望getFromDao()在交易中執行。

我們只使用JDBC而不使用Hibernate。

+2

它應該* *盡一切唯一的交易。你怎麼知道它不是? myjdbcTemplate是否使用與simpleDatasourceTxMgr相同的DataSource?這些bean是如何定義的? –

+0

@JBNizet更新以上。如果方法在內部被調用,也看起來像春天不要求交易建議。No. – kriver

+2

No.交易管理基於AOP。您需要從外部調用該bean來使事務攔截器能夠攔截該調用並啓動事務。這在文檔中有很好的解釋。我不確定爲什麼你不想讓getFromDao()成爲事務的一部分。 –

回答

1

您可以將@Transactional註解的接口 定義之前,一個方法的接口,一個類定義,或者在一個類中的公共 方法上。然而,@Transactional 註釋的存在不足以激活事務行爲。 @Transactional註釋僅僅是元數據,可被 使用的一些運行時基礎結構是@ Transactional-aware,並且 可使用元數據來配置具有事務性 行爲的適當Bean。在前面的示例中, 元素將切換事務行爲。

或者,如果你想註釋你可以用

這是不足夠使它能夠告訴你簡單地 來註釋類@Transactional註釋,添加@EnableTransactionManagement到 您的配置,並然後期待你瞭解它是如何工作的。本部分解釋了彈性 框架的聲明式事務基礎結構在 與事務相關的事件中的內部工作原理。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html