在抛出异常后回滚事务

4

当我在服务方法中抛出异常时,我期望服务上的事务注释会回滚保存操作,但这并不起作用。

这是我的服务:

  @Service
  @Transactional(value = "transactionManager", rollbackFor = Exception.class)
    public class OrderServiceImp implements OrderService {
        @Autowired
        private OrderRepository orderRepository;

        @Override
        public void doSomeStaff(Long orderId) {
             Order order = orderRepository.findOne(orderId);
             orderRepository.save(order);
             throw new NullPointerException("Test transaction exeption");
        }
    }

在 data.xml 文件中,我有以下配置:
<tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>


<jpa:repositories base-package="com.dmitro.repositories" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>

在dispatcher-servlet.xml中,我声明了扫描:
<context:component-scan base-package="com.dmitro.service" />

我正在使用spring-data-jpa 1.8.0.RELEASE版本,请帮忙!

我的配置文件中更新了关于什么和在哪里的信息。 - Dimon
数据文件 data.xml 是否已在 dispatcher-servlet.xml 中导入?OrderServiceImp 是否在 com.dmitro.service 包中? - MarkOfHall
3
你为什么有两个事务管理器? - MarkOfHall
2
Spring会回滚为服务打开的事务。但是由于DAO使用不同的事务管理器,因此为DAO打开的事务在此时已经提交。Steve Hall的问题是正确的:为什么你有两个事务管理器? - JB Nizet
你的方向是正确的,因为这是一个配置问题,感谢你的帮助。 - Dimon
显示剩余3条评论
4个回答

1
@Transactional(value = "transactionManagerForServiceLayer", rollbackFor = Exception.class)

这就是罪魁祸首。你不应该为服务和仓库使用不同的事务管理器。要解决问题,你需要将此处的transactionManagerForServiceLayer替换为transactionManager,然后回滚将会起作用。

0

数据源的自动提交已开启(或为真)。请将其关闭(或设为假)。


0
问题出在配置上,因为我在不同的Spring上下文中声明了服务和事务管理器:事务管理器在根上下文中,而服务在子调度程序servlet.xml上下文中。

0
尝试在OrderRepositoryImpl中抛出异常,看看是否有效。
public class OrderRepositoryImpl implements OrderRepository {
    @Override
    public void save() {
        throw new SomeRunTimeException();
    }
}

public class OrderServiceImp implements OrderService {
    @Override
    public void doSomeStaff(Long orderId) {
        Order order = orderRepository.findOne(orderId);
        orderRepository.save(order);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接