Spring事务传播-服务与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()。从控制器调用CCD_ 8。因此,如果我将服务类设为@Transactional,那么所有内容都将在事务中执行。但我不希望getFromDao()在事务中执行。

我们只使用JDBC,不使用Hibernate。

您可以将@Transactional注释放置在接口之前定义、接口上的方法、类定义或公共方法。然而,仅仅是@Transactional的存在注释不足以激活事务行为。这个@事务性注释只是元数据,可以由一些具有@Transactional意识并且可以使用元数据配置具有transactional的适当bean行为在前面的示例中元素切换事务行为。

或者,如果你想要注释,你可以用启用它

仅仅告诉您用注释类是不够的在@Transactional注释中,将@EnableTransactionManagement添加到您的配置,然后希望您了解这一切作品本节介绍弹簧的内部工作原理框架的声明性事务基础设施交易相关问题。

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

最新更新