Spring事务不会因异常而回滚

时间:2016-10-04 05:22:28

标签: hibernate spring-mvc exception rollback spring-transactions

Config.xml

<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>

Service.java

@Transactional
public void save(Dto dto) throws Exception{
    dao.save(entity);
    throw new Exception();
}

我的问题是这个异常没有回滚事务。我经常搜索并发现默认情况下运行/未检查异常的spring rollback事务。我试过如下;

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

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

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

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

的任何其他方法

1 个答案:

答案 0 :(得分:1)

再看一下图像中的红色矩形:

enter image description here

使用@Transactional默认情况下,仅回滚未经检查的例外,已检查的例外“默认情况下无法回滚

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

enter image description here

您希望将一个类数组传递给此属性,然后您应该像这样编写它:

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

就像你写的那样:

@Transactional(rollbackFor = Exception.class)

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

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="*" rollback-for="Throwable"/>
    </tx:attributes>
</tx:advice>

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