事务在休眠中不回滚
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>
我认为并不是所有的数据库服务器都支持事务。
【讨论】:
以上是关于事务在休眠中不回滚的主要内容,如果未能解决你的问题,请参考以下文章