Spring事务不会回滚

时间:2016-09-29 23:17:24

标签: spring transactions spring-transactions spring-orm java-transaction-service

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

@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,我们的应用程序在Websphere 8.5上运行

2 个答案:

答案 0 :(得分:2)

当发生任何RuntimeException时,弹出事务将默认回滚。如果你的SomeException是一个已检查的异常,那么你必须明确告诉spring在它发生时回滚,请参阅@ saurav-saha的回答。通常的方法是不使用已检查的异常,Spring的理念是始终使用RuntimeException s而不对方法的客户端做任何假设。

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

答案 1 :(得分: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)
}