2012-09-20 119 views
2

我的问题很简单,我想回滚由调用我的服务方法引起的所有数据库更改。我有一个正确的注释问题。我并不确定在哪里放@Transactional,我应该在哪里设置传播到REQUIRES_NEWMANDATORY。我会粘贴一个我写的代码,除了SQLException被抛出的事实不会回滚db更改Spring Integration @Transactional回滚很多数据库操作

代码:

@Service 
public class SwapInsertService { 

    @Autowired 
    MyDao myDao; 

    @Transactional(propagation = Propagation.REQURIES_NEW, rollbackFor = SQLException.class) 
    public void insertToManyTables(MyData data) throws SQLException { 

     insertToSpecificTables(data); 
     myDao.insertTwo(data); 
    } 

    @Transactional(propagation = Propagation.MANDATORY) 
    public void insertToSpecificTables(MyData data) throws SQLException { 

     myDao.insertOne(data); 
    } 
} 

@Repository 
public class MyDaoImpl implements MyDao { 

    @Transactional(propagation = Propagation.MANDATORY) 
    public void insertOne(MyData data) throws SQLException { 

     // INSERT 
    } 

    @Transactional(propagation = Propagation.MANDATORY) 
    public void insertTwo(MyData data) throws SQLException { 

     // throws SQLException 
    } 
} 

假设insertTwo抛出SQLException。我想回滚所有以前的插入。 我在做什么错?

我的理解:

Propagation.REQURIES_NEW创建新的事务。 Propagation.MANDATORY支持当前事务。

insertTwo抛出错误,insertToManyTables回滚一切和voilà。不幸的是,这并不容易。

编辑:重要的是要提到我使用代理CGLIB

+0

你声明事务管理器('<豆ID =“txManager” ...')正确的春天配置?请参阅http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html#transaction-claclarative – fasseg

+0

是的,它被声明,我在日志中看到有代理创建。据我所知,代理创建是由@Transactional发起的。我正在使用CGLIB。 – MrKiller21

回答

4

检查是否AUTO_COMMIT设置为数据源配置错误春季特定的XML

+0

我会看看并让你知道。我没有考虑这个。谢谢。 – MrKiller21

+0

看起来你是对的,我的数据源被设置为自动提交。谢谢。 – MrKiller21