我有一个如下所示的服务类:
@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()
方法,并从getFromDao()
致电doStuff()
和process()
。从控制器调用process()
。所以看起来如果我创建服务类@Transactional
,那么一切都在事务中执行。但我不希望getFromDao()
在交易中执行。
我们只使用JDBC而不使用Hibernate。
答案 0 :(得分:1)
您可以在界面前放置@Transactional注释 定义,接口上的方法,类定义或公共 一个班级的方法。然而,仅仅存在@Transactional 注释不足以激活事务行为。该 @Transactional注释只是可以使用的元数据 一些@ Transactional-aware的运行时基础架构,可以 使用元数据配置具有事务性的适当bean 行为。在前面的例子中, 元素切换事务行为。
或者如果您想要注释,可以使用
启用它仅仅告诉你简单地用你的课程注释是不够的 @Transactional注释,添加@EnableTransactionManagement 你的配置,然后期望你了解它的全部 作品。本节介绍Spring的内部工作原理 框架的声明式事务基础结构 与交易有关的问题。
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html