是的,您的代码将适用于您提到的场景。请参阅下面的代码示例,执行后,只有 1 条记录插入到 TEST_TABLE 中,CD=INSERT3。我在来自 Dao2impl 的插入中放入了错误的列,导致事务失败。
下面是 Service1 类,我从中调用 insertMainServiceCall 方法,该方法调用了需要在事务中执行的 insertData 方法:
@Service
public class Service1 {
@Autowired
private Service2 service2;
@Autowired
private DataSource datasource;
private JdbcTemplate jdbcTemplate;
public Service2 getService2() {
return service2;
}
public void setService2(Service2 service2) {
this.service2 = service2;
}
public DataSource getDatasource() {
return datasource;
}
public void setDatasource(DataSource datasource) {
this.datasource = datasource;
}
public void insertMainServiceCall(){
String sqlCmd="INSERT INTO TEST_TABLE " +
"(CD, NAME, DEPT) VALUES (?, ?, ?)";
jdbcTemplate = new JdbcTemplate(datasource);
jdbcTemplate.update(sqlCmd, new Object[] {"INSERT3",
"INSERT3","INSERT3"
});
service2.insertData();
}
}
下面是我的 Service2 类:
@Transactional
@Service
public class Service2 {
@Autowired
private Dao1 dao1;
@Autowired
private Dao2 dao2;
public Dao1 getDao1() {
return dao1;
}
public void setDao1(Dao1 dao1) {
this.dao1 = dao1;
}
public Dao2 getDao2() {
return dao2;
}
public void setDao2(Dao2 dao2) {
this.dao2 = dao2;
}
public void insertData(){
dao1.insert1();
dao2.insert2();
}
}
下面是我的 Dao1Impl 类代码:
@Repository
public class Dao1Impl implements Dao1{
@Autowired
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;
public void insert1(){
String sqlCmd="INSERT INTO TEST_TABLE " +
"(CD, NAME, DEPT) VALUES (?, ?, ?)";
jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(sqlCmd, new Object[] {"INSERT1",
"INSERT1","INSERT1"
});
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
下面是我的 Dao2Impl 类代码:
@Repository
public class Dao2Impl implements Dao2 {
@Autowired
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;
public void insert2(){
String sqlCmd="INSERT INTO TEST_TABLE " +
"(CD, NAME, DEPT1) VALUES (?, ?, ?)";
jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(sqlCmd, new Object[] {"INSERT2",
"INSERT2","INSERT2"
});
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
在 spring-config.xml 中,您需要设置事务支持如下:-
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">