【问题标题】:Spring Transactional rollbackFor not workingSpring Transactional rollbackFor 不工作
【发布时间】:2015-05-02 23:47:52
【问题描述】:

我有一种方法可以将项目添加到表格并测试异常 我的项目存储在表中。引发异常,但未引发事务 回滚 我的方法

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, 
        rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class})
public MyBean addItem(MyBean bean, Integer iduser) throws Exception  {

    NalogBean nb = txTemplate.execute(new TransactionCallback<MyBean>() {

        @Override
        public MyBean doInTransaction(TransactionStatus txStatus) {
            MyBean nbl = null;
            try {
                sessionFactory.getCurrentSession().saveOrUpdate(bean);
                throw new RuntimeException("Exception throwed!");

            } catch (Exception e) {
                txStatus.setRollbackOnly();
            }
            return nbl;
        }
    });

    return nb;          
}

我的 servlet-context 是标准的

<tx:annotation-driven transaction-manager="transactionManager"/>

<beans:bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="${database.driver}" />
    <beans:property name="url" value="${database.url}" />
    <beans:property name="username" value="${database.user}" />
    <beans:property name="password" value="${database.password}" />
</beans:bean>


<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource"></beans:property>
    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
        </beans:props>
    </beans:property>
    <beans:property name="packagesToScan" value="rs.co"></beans:property>


    <beans:property name="annotatedClasses">
        <beans:list>
            <beans:value>rs.co.mfp.klijent.finansije.model.NalogModel</beans:value>
        </beans:list>
    </beans:property>

</beans:bean>


<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="sessionFactory"/>
</beans:bean>

当我调用 addItem 时,它将 bean 存储到表中。 我也尝试不使用 txTemplate,只是 sessionFactory.getCurrentSession().saveOrUpdate(bean); throw new RuntimeException("抛出异常!"); 但同样的结果。项目被存储到表中。 有什么想法吗?

【问题讨论】:

  • 你可以去掉rollbackFor块中的RuntimeException,因为它继承了Exception。此外,您重复 readOnly 和传播的默认值。
  • mh-dev,是的,它是双重的,但我尝试了一切。我也尝试@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class}) public NalogBean addNalog(NalogBean bean, Integer iduser) throws Exception { NalogModel模型=空;模型 = 转换模型(豆); sessionFactory.getCurrentSession().saveOrUpdate(model); bean.setIdnalog(model.getIdnalog()); if (true) throw new RuntimeException("抛出异常!"); //testRequired();回豆; },但它将数据写入表中
  • 说实话,你所做的与我现在使用spring的方式相去甚远。整个 xml 配置自动执行 Spring Boot。 (在属性文件中的数据源配置旁边)。一个重要的问题:您是否从同一个类中调用此方法?如果是,则注释在没有 aop 的情况下没有任何效果。
  • 不,我从 springMvc 项目中调用它,控制器。这是来自测试项目的链接mfp.co.rs/wp-content/uploads/2015/05/testHibernate.zip
  • 您使用的是 MySQL,然后确保您使用的是支持事务的表(InnoDB 类型而不是 MyISAM 类型)。

标签: spring spring-mvc transactional


【解决方案1】:

当你在上面的方法中使用Transaction注解时,不需要使用txStatus。

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, 
        rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class})
public MyBeanId addItem(MyBean bean, Integer iduser) throws Exception  {

               return sessionFactory.getCurrentSession().saveOrUpdate(bean);

}

当出现异常时,自动回滚事务 希望能帮到你

【讨论】:

  • 我试了一下,我把 if (true) throw new RuntimeException("Exception throwed!");但是bean存储在表中。
  • 这里是来自测试项目mfp.co.rs/wp-content/uploads/2015/05/testHibernate.zip的链接
  • 感谢 M. Deinum,他解决了我的问题。问题出在 MySQL 表中。我必须将表转换为 InnoDB ALTER TABLE table_name ENGINE=InnoDB,一切都很好。
猜你喜欢
  • 2021-02-02
  • 2020-12-11
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2017-06-04
  • 2016-12-19
  • 2016-10-04
  • 1970-01-01
相关资源
最近更新 更多