0

我们有一个像这样的服务类

@Service
@Transactional
public class DoSomeServiceImpl1 implements IDoSomeService {

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

当 ldap dao 调用发生异常时,插入到数据库中的数据仍然存在,不会回滚。

ldap 调用方法类似于下面的方法

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

谁可以帮我这个事?为什么数据库不会插入回滚?顺便说一句,我们正在使用 spring-tx 版本 4.2.4.RELEASE 进行 dao 调用,我们的应用程序在 Websphere 8.5 上运行

4

2 回答 2

3

默认情况下,Spring 事务将在发生任何RuntimeException情况时回滚。如果您SomeException是已检查的异常,那么您必须明确告诉 spring 在它发生时回滚,请参阅@saurav-saha 的答案。通常的方法是不使用检查异常,但 Spring 的理念是始终使用RuntimeExceptions 并且不对方法的客户端做出任何假设。

另一方面,如果您SomeException实际上是 a RuntimeException,那么您很可能没有设置 a TransactionManager。要判断是否是这种情况,请在您的方法中设置一个断点,然后org.springframework.transaction.interceptor.TransactionInterceptor在调用堆栈中查找。如果它不存在,则说明没有事务处于活动状态,您需要配置事务管理器。

于 2016-09-30T07:15:38.760 回答
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)
}
于 2016-09-30T06:32:36.623 回答