Spring事务传播 - 服务与DAO

时间:2015-11-12 17:49:26

标签: java spring dao jdbctemplate transactional

我有一个如下所示的服务类:

@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。

1 个答案:

答案 0 :(得分:1)

  

您可以在界面前放置@Transactional注释   定义,接口上的方法,类定义或公共   一个班级的方法。然而,仅仅存在@Transactional   注释不足以激活事务行为。该   @Transactional注释只是可以使用的元数据   一些@ Transactional-aware的运行时基础架构,可以   使用元数据配置具有事务性的适当bean   行为。在前面的例子中,   元素切换事务行为。

或者如果您想要注释,可以使用

启用它
  

仅仅告诉你简单地用你的课程注释是不够的   @Transactional注释,添加@EnableTransactionManagement   你的配置,然后期望你了解它的全部   作品。本节介绍Spring的内部工作原理   框架的声明式事务基础结构   与交易有关的问题。

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