2012-09-20 118 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