[英]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失败,我仍然可以从ClassA和ClassB中插入数据库
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.