简体   繁体   English

春季多笔交易回滚

[英]Spring multiple transaction roll back

I have a requirement wherein I have to insert into 3 separate tables through 3 DAO classes. 我有一个要求,我必须通过3个DAO类将其插入3个单独的表中。

ClassADAO
ClassBDAO
ClassCDAO

I want to have a single transaction for all the three classes so that if one insertion fails I want to roll back the complete transaction that is inserted through previous classes. 我希望所有三个类都具有一个事务,因此,如果一次插入失败,我想回滚通过先前类插入的完整事务。

I have my configured xml as shown below 我有配置好的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>

In controller annotated as follows 在控制器中注释如下

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

But still if ClassCDAO fails, I can c insertions in my db from ClassA and ClassB 但是,即使ClassCDAO失败,我仍然可以从ClassAClassB中插入数据库

Controller: 控制器:

@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";
    }

}

My Business Layer: 我的业务层:

 @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: 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 and ClassCDAO are also as shown above. ClassBDAO和ClassCDAO也如上所述。

Move your @Transactional annotation to MyBusinessLayer class. 将您的@Transactional批注移动到MyBusinessLayer类。 Unless you have your DataSource configured as autocommit , your code seems correct. 除非您将DataSource配置为autocommit ,否则代码似乎是正确的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM