Spring数据:如何在一个事务中锁定一行,让其他事务一直等到它被释放?

Spring Data: How to lock a row in a transaction and make other transactions wait until it is released?

我有一个 @Transactional 方法,我使用 findById() 从 Spring 数据存储库请求记录。

现在我想以一种方式锁定此对象,其他 @Transactional 方法如果并行执行将等待直到释放锁。

我尝试了什么: 我浏览了 @Lock and LockModeType 的文档,但我仍然无法确定它是否涵盖了我的情况。

另一种选择是 select for update 在数据库级别,但我不确定这是最佳选择。

问:如何在spring数据事务中锁定实体对象(数据库行)并让其他事务等待?

你要的叫悲观锁。 Spring 通过 JPA 规范的数据支持这一点。有两种可用的悲观锁定模式:

我认为您混淆了事务隔离和锁定。通过 @Transactional 注解你可以指定应用到连接的隔离,而通过 psirng-data @Locking 你可以定义锁定模式。锁定模式与 @Transactional 上指定的事务隔离无关。实际上,如果隔离是可串行化的,则您不需要通过 JPA 或 spring-data 进行锁定,因为数据库会处理它。在这种情况下,锁将由 DB 控制。

当您定义锁定时,控制权就在您手中。下面是对悲观锁类型的描述。

PESSIMISTIC_WRITE - 所有事务包括只读事务都将被阻塞,直到持有锁的事务完成。不允许脏读。

PESSIMISTIC_READ - 当你有这个模式时,并发事务可以读取锁定行的数据。所有更新都需要获取PESSIMISTIC_WRITE锁。

除此之外,您还可以指定锁定事务完成的超时时间。