在下面的代码片段中,整个表被锁定,而不是单行:
@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);
请告诉我如何完成这项工作,并推荐一篇好文章来学习这个问题。
最佳答案
LockModeType.READ is equals to OPTIMISTIC ,这意味着 Hibernate 会在事务完成之前尝试验证乐观锁定实体版本。
除了 possible race condition ,这不会对你有太大帮助。在您的情况下,实体 acquires an implicit lock当 flush operation issues an INSERT statement .
因为实体具有唯一的主键,所以您甚至不应该太关心锁定行,因为您不能让两个事务插入同一行。并发控制更适合 UPDATE/DELETE 语句,即使这样,您也不需要锁定整个表(只需锁定要更改的记录)。
关于java - 如何使用 JPA 锁定数据库行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416653/