我们有一个类似这样的服务类
@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上运行
答案 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)
}