Spring事务不会回滚异常

Est*_*sty 1 hibernate exception spring-mvc rollback spring-transactions

配置文件

<bean id="emfactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" ref="default"/>
    <property name="jpaVendorAdaptor">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdaptor"/>
    </property>
    <property name="jpaProperties">
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.dialect">com.xxx.xxx.xxx.xxx.SQLServer2012CustomDialect</prop>
    </property>
</bean>

<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emfactory"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

服务.java

@Transactional
public void save(Dto dto) throws Exception{
    dao.save(entity);
    throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是这个异常不会回滚事务。我搜索了很多,发现默认情况下,运行时/未检查异常的弹簧回滚事务。我试过如下;

@Transactional
public void save(Dto dto) throws Exception{
    dao.save(entity);
    throw new RunTimeException();
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但并不总是在那些到处抛出运行时异常的代码中。所以,我确实挖掘并发现 rollbackFor 如下;

@Transactional(rollbackFor = Exception.class)
public void save(Dto dto) throws Exception{
    dao.save(entity);
    throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)

现在我必须更改我的所有代码以使用 rollbackFor 更改 @Transactional。但是还有其他方法可以将所有 @Transaction 建议属性更改为 rollbackFor = Exception.class 吗?

Mos*_*rad 5

再看看图片中的红色矩形:

在此处输入图片说明

随着@Transactional默认是回滚只有unchecked异常,检查异常不会回滚 默认

这可能会解决您的问题:(看红色矩形)

在此处输入图片说明

你假设将一个类数组传递给这个属性,那么你应该这样写:

@Transactional(rollbackFor = new Class[]{Exception.class})

不是像你这样写的:

@Transactional(rollbackFor = Exception.class)

现在,如果您想在不指定rollbackForproperty 的情况下回滚已检查的异常,则必须将 XML 配置添加到您的配置文件中。像这样:

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="*" rollback-for="Throwable"/>
    </tx:attributes>
</tx:advice>
Run Code Online (Sandbox Code Playgroud)

将此添加到您的配置 XML 文件中。以上将回滚已检查的异常。