在以下代码段中,整个表被锁定而不是单行:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void myInsertMethod(MyEntity myEntity) {
/*1 this doesn't works*/
manager.lock(myEntity,LockModeType.READ);
manager.persist(myEntity);
/* and this works but I dont know is it what i want or not...*/
manager.persist(myEntity);
manager.lock(myEntity,LockModeType.READ);
}
我认为正确的代码如下,但它不起作用
/*lock entire table for select*/
manager.lock(MyEntity.class.LockModeType.READ);
/* and after locking table persist code */
manager.persist(myEntity);
请告诉我怎样才能完成这项工作,并建议我学习这个问题的好文章。
答案 0 :(得分:1)
LockModeType.READ is equals to OPTIMISTIC,意味着Hibernate会在事务完成之前尝试验证乐观锁定的实体版本。
除了possible race condition之外,这对你的帮助太大了。在您的情况下,acquires an implicit lock时的实体flush operation issues an INSERT statement。
因为实体具有唯一的PRIMARY KEYS,所以你不应该过多地关心锁定行,因为你不能有两个插入同一行的事务。并发控制更适合UPDATE / DELETE语句,即使这样,您也不需要锁定整个表(只需要更改的记录)。