我有一個服務類象下面這樣: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。
它應該* *盡一切唯一的交易。你怎麼知道它不是? myjdbcTemplate是否使用與simpleDatasourceTxMgr相同的DataSource?這些bean是如何定義的? –
@JBNizet更新以上。如果方法在內部被調用,也看起來像春天不要求交易建議。No. – kriver
No.交易管理基於AOP。您需要從外部調用該bean來使事務攔截器能夠攔截該調用並啓動事務。這在文檔中有很好的解釋。我不確定爲什麼你不想讓getFromDao()成爲事務的一部分。 –