事务在休眠中不回滚

Posted

技术标签:

【中文标题】事务在休眠中不回滚【英文标题】:Transaction does not rollback in hibernate 【发布时间】:2013-11-25 08:02:48 【问题描述】:

我遇到了回滚事务的问题。下面我写了一些bean的配置。我做了 2 个 SQL 查询:删除和更新。并且当UPDATE产生异常(外键约束)时,第一个查询(DELETE)不回滚。谁能告诉我问题出在哪里?为了清楚起见,我只写了一些配置,所以如果需要更多信息,请告诉我。提前致谢!

上下文:

我有带有方法 removeUser 的 DAO 层:

public void removeUser(final Long id) 
        getHibernateTemplate().execute(new HibernateCallback() 
            @Override
            public Object doInHibernate(Session session) throws HibernateException, SQLException 
                executeUpdate("delete from table1 where user_id = ?", session, id);
                executeUpdate("update table2 set user_id = null where user_id = ?", session, id);
                return null;
            

            private void executeUpdate(String queryString, Session session, Long... params) 
                SQLQuery query = session.createSQLQuery(queryString);

                for (int paramIndex = 0; paramIndex < params.length; paramIndex++) 
                    Long param = params[paramIndex];
                    query.setParameter(paramIndex, param);
                

                query.executeUpdate();
            
        );

从服务内部调用此方法:

public void removeUser(Long id) 
        userDao.removeUser(id);

这个服务是通过spring配置的:

<bean name="adminUserService" parent="txProxyServiceTemplate">
   ... setting properties ...     
</bean>

<bean id="txProxyServiceTemplate" abstract="true"
          class="com.xalmiento.desknet.ui.server.service.transaction.GWTTransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="remove*">PROPAGATION_NESTED</prop>
            </props>
        </property>
</bean>

<bean id="transactionManager"
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="nestedTransactionAllowed" value="true"/>
</bean>

【问题讨论】:

您使用的是哪个数据库,PROPAGATION_NESTED 也只适用于某些数据库,您是否尝试过PROPAGATION_REQUIRED 我们正在使用 mysql 5.5.31,我们也在使用 org.hibernate.dialect.MySQL5InnoDBDialect 确保你的表确实是 InnoDB 表而不是 MyISAM 表! 一件事是 MySQL 不支持 NESTED (afaik)。 NESTED 可能并不像您认为的那样,我强烈建议您尝试使用“REQUIRED”。 我认为在调用 query.executeUpdate() 时它将完成事务,并且下一个 executeUpdate 将被视为新事务。这可能是问题。 【参考方案1】:

试试

<prop key="remove*">PROPAGATION_REQUIRED</prop>

我认为并不是所有的数据库服务器都支持事务。

【讨论】:

以上是关于事务在休眠中不回滚的主要内容,如果未能解决你的问题,请参考以下文章

java中事务不回滚!

@Transaction不回滚事务问题

MySQL事务不回滚会有啥影响?

面试突击86:SpringBoot 事务不回滚?怎么解决?

@Transactional注解事务不回滚不起作用无效

Spring boot,测试后事务不回滚