2016-05-22 25 views
2

我有一个需求,其中我必须通过3个DAO类插入3个独立的表。春季多笔交易回滚

ClassADAO 
ClassBDAO 
ClassCDAO 

我想为所有的三类一个单一的交易,这样,如果一个失败,插入我想回滚通过前面的类插入了完整的事务。

我有配置XML如下所示

<tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
      id="dataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"></property> 
    <property name="username" value="******"></property> 
    <property name="password" value="********"></property> 
    </bean> 

在控制器注解如下

@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED) 

但仍然如果ClassCDAO失败,我可以在分贝Ç插入从ClassA的B类

控制器:

@Controller 
@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED) 
public class MyController{ 

@Autowired 
private MyBusinessLayer mybusinessLayer; 

@RequestMapping(value = "/register.htm", method = RequestMethod.POST) 
    public String saveRegistration(
      final @ModelAttribute("registration") @Valid Registration registration, 
      final BindingResult result, final Model model) { 
      if (result.hasErrors()) { 
       return "myPage"; 
      } else { 
       mybusinessLayer.saveRegistration(registration); 
      } 

     return "myPage"; 
    } 

} 

我的业务层:

@Component 
public class MyBusinessLayer{ 

    @Autowired 
    private ClassA classA; 

    @Autowired 
    private ClassB classB; 

    @Autowired 
    private ClassC classC; 

    public void saveRegistration(Registration registration) { 
     Company company = RegistrationHelper.buildCompany(registration); 
     classA.saveCompany(company); 
     Contact contact = RegistrationHelper.buildContact(registration, company.getCompanyId()); 
     classB.saveContact(contact); 
     User user = RegistrationHelper.buildUser(registration, contact.getCompanyID(), 
       contact.getContactID()); 
     classC.saveUser(user); 
    }  

    } 

ClassADAO:

@Component 
public class CompanyDAOImpl implements CompanyDAO { 

    @Autowired 
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate; 

    public void setDataSource(DataSource dataSource) { 
     this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 
    } 

    @Override 
    public void saveCompany(Company company) { 
     String insertCompanySQL = //insert statement; 
     //code here 
     SqlParameterSource paramSource = new MapSqlParameterSource(bind); 
     namedParameterJdbcTemplate.update(insertCompanySQL, paramSource); 
    } 
} 

ClassBDAO和ClassCDAO也如上所示。

+0

请显示所有相关代码。在这种情况下,调用DAO方法。 – Nikem

+0

@Nikem:更新我的问题本身的代码 – Pathfinder

回答

0

将您的@Transactional注释移动到MyBusinessLayer类。除非你的DataSource配置为autocommit,否则你的代码似乎是正确的。

+0

我将我的@Transactional移动到业务层,但仍然发生Pre插入,并且在我的config xml数据源中没有将其他自动提交设置为false或tru – Pathfinder