2015-11-12 41 views
0

我有一个服务类象下面这样: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。

+2

它应该* *尽一切唯一的交易。你怎么知道它不是? myjdbcTemplate是否使用与simpleDatasourceTxMgr相同的DataSource?这些bean是如何定义的? –

+0

@JBNizet更新以上。如果方法在内部被调用,也看起来像春天不要求交易建议。No. – kriver

+2

No.交易管理基于AOP。您需要从外部调用该bean来使事务拦截器能够拦截该调用并启动事务。这在文档中有很好的解释。我不确定为什么你不想让getFromDao()成为事务的一部分。 –

回答

1

您可以将@Transactional注解的接口 定义之前,一个方法的接口,一个类定义,或者在一个类中的公共 方法上。然而,@Transactional 注释的存在不足以激活事务行为。 @Transactional注释仅仅是元数据,可被 使用的一些运行时基础结构是@ Transactional-aware,并且 可使用元数据来配置具有事务性 行为的适当Bean。在前面的示例中, 元素将切换事务行为。

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

这是不足够使它能够告诉你简单地 来注释类@Transactional注释,添加@EnableTransactionManagement到 您的配置,并然后期待你了解它是如何工作的。本部分解释了弹性 框架的声明式事务基础结构在 与事务相关的事件中的内部工作原理。

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