【问题标题】:Spring multiple transaction roll backSpring 多事务回滚
【发布时间】:2016-09-19 10:50:58
【问题描述】:

我有一个要求,我必须通过 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 失败,我可以从 ClassAClassB

在我的数据库中插入 c

控制器:

@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也如上所示。

【问题讨论】:

  • 请显示所有相关代码。在这种情况下,DAO 方法的调用。
  • @Nikem :更新我的问题本身的代码

标签: mysql spring-mvc transactional


【解决方案1】:

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

【讨论】:

  • 我将@Transactional 移动到业务层,但预插入仍在发生,并且在我的配置 xml 数据源中没有额外的自动提交设置为 false 或 tru
猜你喜欢
  • 2011-11-21
  • 2017-03-03
  • 2012-03-10
  • 2018-07-15
  • 2018-11-05
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多