当前位置: 代码迷 >> Java Web开发 >> 学习spring事务传播遇到有关问题
  详细解决方案

学习spring事务传播遇到有关问题

热度:158   发布时间:2016-04-13 22:33:36.0
学习spring事务传播遇到问题,求助
我想测试的功能:Propagation.REQUIRES_NEW。
我设计的是,批量插入五本书,第五次插入异常回滚。但是前面的四次正常插入。
但是(每次遇到但是的时候我就头痛),实际结果却是第五次出现了异常,导致前面4次没有错误的也回滚了。请问大家问什么,谢谢。
下面是我的一些代码片段:

下面是BookService中的两个方法:
//批量增加5本书,要求能加一本是一本,有错误的话已经添加的不会滚(我知道这样不合理,但是这只是一个测试)
public void addBooks() throws Exception{
for(int i =1; i<6; i++){
this.addBook(i+"");
}
}
//添加一本书,这里定义了事务的传播REQUIRES_NEW,每次都新建一个事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void addBook(String id) throws Exception{
bookDao.addBook(id);
}

//下面是BookDao中的方法,前4次执行成功,第五次失败:
public Map addBook(String id) throws Exception{
if(id.equals("5")){
throw new RuntimeException("我就不成功!");
}
String sql = "INSERT into book(id,bookid,pagenum,`content`,gatherdate) values(?,'1','1','a',SYSDATE())";
Object[] values = new Object[]{id };
int i = jdbcTemplate.update(sql,values);
return null;
}

------解决思路----------------------
的事务是对BookService生效的,而不是BookDao。
所以对BookService中的一个方法的调用始终是一个事务,嵌套调用也算一个事务。

要想实现你的目标,可以手动从Dao中获取Connection,conn.commit(); 不过这样会影响数据库IO性能。
  相关解决方案