【发布时间】: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