在JBOSS 7.1 AS,我使用的容器管理事务。 对于每个请求,我做的几个实体进行更新。 大多数实体使用“插入,合并,刷新”从EntityManager的方法来管理更新。 然而,存在使用明确的查询做“executeUpdate的”关于DB一个实体(请参见下面的代码片段)。 这个SQL更新会立即将提交给DB和它不与容器管理的事务(如其他实体更新)对齐。 反正是有对准容器管理事务的明确SQL更新(下一个)? 我试图让回滚工作,这个SQL更新没有被rolledback。 所有其他实体的更新和插入,除了这一个是工作的罚款。 感谢你的帮助。
代码片段:
entityManager.createQuery
( "UPDATE Balance a SET a.balanceValue = :newValue WHERE a.balanceId =:balanceId AND a.balanceValue = :currentValue" ) .setParameter("balanceId", cb.getBalanceId()) .setParameter("currentValue", cb.getBalanceValue()).setParameter("newValue", newAmt).executeUpdate();
附加代码:(下面的代码是使用Bean管理的事务,但我得到同样的行为CMT以及)
ut.begin();
ChargingBalance bal2 = entityManager.find(ChargingBalance.class, 13);
bal2.setResetValue((new Date()).getTime());
String UPDATE_BALANCE_AND_EXPIRYDATE_EQUAL = "UPDATE ChargingBalanceValue a"
+ " SET a.balanceValue = :newValue "
+ " WHERE a.balanceId = :balanceId";
Query query = entityManager.createQuery(UPDATE_BALANCE_AND_EXPIRYDATE_EQUAL)
.setParameter("balanceId", 33)
.setParameter("newValue", 1000l);
/*The executeUpdate command gets committed to DB before ut.commit is executed */
query.executeUpdate();
/* This below only commits changes on ResetValue */
ut.commit();
ut.begin();
ChargingBalance bal = entityManager.find(ChargingBalance.class, 23);
bal.setResetValue(1011l);
query = entityManager.createQuery(UPDATE_BALANCE_AND_EXPIRYDATE_EQUAL)
.setParameter("balanceId", 33)
.setParameter("newValue", 2000l);
query.executeUpdate();
/* This rollback doesn't rollback changes executed by executeUpdate, but it rollbacks ResetValue change */
ut.rollback();