Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 事务在hibernate中不回滚_Java_Sql_Spring_Hibernate_Transactions - Fatal编程技术网

Java 事务在hibernate中不回滚

Java 事务在hibernate中不回滚,java,sql,spring,hibernate,transactions,Java,Sql,Spring,Hibernate,Transactions,我对回滚事务有问题。下面我写了一些bean的配置。我执行两个SQL查询:删除和更新。当UPDATE生成异常(外部ket的约束)时,第一个查询(DELETE)不会回滚。谁能告诉我问题出在哪里吗?为了清晰起见,我只编写了一些配置,因此如果需要更多信息,请告诉我。非常感谢 背景: 我有方法removeUser的DAO层: public void removeUser(final Long id) { getHibernateTemplate().execute(new Hibernat

我对回滚事务有问题。下面我写了一些bean的配置。我执行两个SQL查询:删除和更新。当UPDATE生成异常(外部ket的约束)时,第一个查询(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();
            }
        });
}
此服务通过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>

... 正在设置属性。。。
嵌套传播
尝试使用

<prop key="remove*">PROPAGATION_REQUIRED</prop>
<代码>传播\u必需
我不认为所有的数据库服务器都支持该事务。

您使用的是哪一个数据库,而且
PROPAGATION\u NESTED
只在某些数据库上工作,您是否尝试过
PROPAGATION\u REQUIRED
替代。我们使用的是mysql 5.5.31,此外,我们正在使用org.hibernate.dialent.mysql5innodbdialent确保您的表确实是InnoDB表,而不是MyISAM表!有一件事是MySQL不支持嵌套(afaik)。嵌套可能并不代表您认为它的意思,我强烈建议尝试使用“REQUIRED”。我认为调用query.executeUpdate()会完成事务,下一个executeUpdate将被视为新事务。这可能是问题所在。
<prop key="remove*">PROPAGATION_REQUIRED</prop>