Java 同时删除一组实体时出现OptimisticLockException

Java 同时删除一组实体时出现OptimisticLockException,java,hibernate,google-app-engine,concurrency,ehcache,Java,Hibernate,Google App Engine,Concurrency,Ehcache,我试图创建一个简单的Servlet方法,通过使用Hibernate删除一组对象 List<MyEntity> entities = dao.getEntities(...); // just a query that returns a collection of managed entities for (MyEntity entity : entities) dao.remove(entity); // em.remove(..) nothing more 两个线程试图同

我试图创建一个简单的Servlet方法,通过使用Hibernate删除一组对象

List<MyEntity> entities = dao.getEntities(...); // just a query that returns a collection of managed entities

for (MyEntity entity : entities)
  dao.remove(entity); // em.remove(..) nothing more

两个线程试图同时删除实体,这是显而易见的,但如何解决这个问题:最广泛的方法是捕获OptimisticException、回滚事务并从头开始操作。或者您可以使用悲观锁定:有什么可以解决的?它按预期正常工作。当两个人试图同时删除同一个列表时,您希望发生什么情况?
[INFO] Caused by: javax.persistence.RollbackException: Error while committing the transaction
[INFO]  at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
[INFO]  at xxx.xxx.xxx.TransactionTemplate.invokeWithinTransation(TransactionTemplate.java:23)
[INFO]  ... 42 more
[INFO] Caused by: javax.persistence.OptimisticLockException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
[INFO]  at org.hibernate.jpa.spi.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:1800)
[INFO]  at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1705)
[INFO]  at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
[INFO]  at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:82)
[INFO]  ... 43 more
[INFO] Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
[INFO]  at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
[INFO]  at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
[INFO]  at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:63)
[INFO]  at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400)
[INFO]  at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630)
[INFO]  at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114)
[INFO]  at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)
[INFO]  at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)
[INFO]  at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
[INFO]  at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
[INFO]  at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
[INFO]  at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
[INFO]  at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
[INFO]  at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
[INFO]  at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
[INFO]  ... 43 more