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); 
     } 
} 

Может кто-нибудь помочь мне в этом? Почему бы не откат вставки базы данных? кстати для вызова дао мы используем пружинно-TX версию 4.2.4.RELEASE и наше приложение работает на Websphere 8.5

+0

Опубликовать фактический имплантат и обслуживание. Конфигурирование вашего приложения и объяснение, какую базу данных вы используете. –

ответ

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 является проверенным исключением, тогда вам придется явно указывать весне, чтобы вернуться назад, когда это происходит, см. Ответ @ saurav-saha. Обычный подход заключается в том, чтобы не использовать проверенные исключения, хотя философия Spring всегда должна использовать RuntimeException s и не делать никаких предположений о клиенте метода.

Если, с другой стороны, ваш SomeException действительно является RuntimeException, то вы, скорее всего, не настроили TransactionManager. Чтобы определить, если это так, установите точку останова в вашем методе и найдите org.springframework.transaction.interceptor.TransactionInterceptor в стеке вызовов. Если его нет, то транзакция не активна, и вам нужно будет настроить диспетчер транзакций.

Смежные вопросы