Java 事务在hibernate中不回滚
我对回滚事务有问题。下面我写了一些bean的配置。我执行两个SQL查询:删除和更新。当UPDATE生成异常(外部ket的约束)时,第一个查询(DELETE)不会回滚。谁能告诉我问题出在哪里吗?为了清晰起见,我只编写了一些配置,因此如果需要更多信息,请告诉我。非常感谢 背景: 我有方法removeUser的DAO层: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
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>