我有一个服务类象下面这样: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()成为事务的一部分。 –