0

我們有一個是這樣的Spring的事務不會回退

@Service 
@Transactional 
public class DoSomeServiceImpl1 implements IDoSomeService { 

@Override 
public void doSomething() throws SomeException { 
    //dao calls (database insert) 
    //ldap dao call (ldap insert) 
} 

當一個異常在LDAP道通話發生在一個服務類,插在數據庫中的數據仍然存在,不會回滾。

的LDAP調用方法是一樣的東西下面

public void insertLDAPRecord() throws SomeException { 
     try { 
     //ldap insert logic 
     } catch (LDAPException e) { 
      throw new SomeException("ldapexception",e); 
     } 
} 

了一個任何人都可以幫助我在此?爲什麼數據庫不會插入回滾?通過對DAO調用的方式,我們在使用Spring-TX版本4.2.4.RELEASE和我們的應用程序是WebSphere 8.5

+0

發佈實際dao impl和服務。配置你的應用程序並解釋你正在使用哪個數據庫。 –

回答

1

運行如果你想在事務回滾@Transactional註解應該有的rollbackFor財產。您可以使用@Transactional批註方法而不是通過類。

@Override 
@Transactional(rollbackFor = Exception.class, readOnly = false) 
public void doSomething() throws SomeException { 

    //dao calls (database insert) 
    //ldap dao call (ldap insert) 
} 
1

當任何RuntimeException發生時,彈簧交易將默認回滾。如果你的SomeException是一個檢查異常,那麼你必須明確告訴spring在它發生時回滾,請參閱@saurav-saha的回答。雖然通常的做法是不使用檢查的異常,但Spring的理念是始終使用RuntimeException,並且不對任何方法的客戶做出任何假設。

如果另一方面您的SomeException實際上是RuntimeException,那麼您很可能還沒有設置TransactionManager。要判斷是否屬於這種情況,請在您的方法中設置一個斷點,然後在調用堆棧中查找org.springframework.transaction.interceptor.TransactionInterceptor。如果它不存在,那麼沒有事務處於活動狀態,您需要配置一個事務管理器。