Sas*_*ota 5 java spring spring-transactions spring-data-jpa
我有一种@Transactional方法可以使用findById()Spring Data 存储库请求记录。
现在我想以一种方式锁定这个对象,@Transactional如果并行执行的其他方法将等到锁定被释放。
我尝试过的:我浏览了@Lock和LockModeType的文档,但我仍然无法弄清楚它是否涵盖了我的情况。
另一种选择是select for update在数据库级别,但我不确定它是最佳选择。
Q:如何在spring数据事务中锁定一个Entity对象(db row)并使其他事务等待?
你想要的是悲观锁。Spring Data 通过 JPA 规范支持这一点。悲观锁有两种模式可用:
我认为您将事务隔离与锁定混为一谈。通过@Transactional注解,您可以指定应用于连接的隔离,而通过 pirng-data @Locking 您可以定义锁定模式。锁定模式与 上指定的事务隔离无关@Transactional。实际上,如果隔离是 SERIALIZEABLE,您将不需要通过 JPA 或 spring-data 锁定,因为数据库会处理它。在这种情况下,锁将由 DB 控制。
当您定义锁定时,控制权在您手中。这里是悲观锁类型的描述。
悲观_写 - 包括只读事务在内的所有事务都将被阻塞,直到持有锁的事务完成。不允许脏读。
PESSIMISTIC_READ - 当你有这个模式时,并发事务可以读取锁定行的数据。所有更新都需要获得 PESIMISTIC_WRITE 锁。
除此之外,您可以指定锁定事务完成的超时时间。
| 归档时间: |
|
| 查看次数: |
3411 次 |
| 最近记录: |