【问题标题】: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 将被视为新事务。这可能是问题。

标签: java sql spring hibernate transactions


【解决方案1】:

试试

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2013-08-18
    • 2011-06-23
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多