Spring Data:如何在一个事务中锁定一行并使其他事务等待其释放?

时间:2019-07-05 11:20:54

标签: java spring spring-data-jpa spring-transactions

我有一个@Transactional方法,我在其中使用Spring Data存储库中的findById()请求记录。

现在,我希望以一种其他@Transactional方法并行执行的方式来锁定该对象,直到释放该锁为止。

我尝试过的事情:我浏览了@LockLockModeType的文档,但仍然不知道是否涵盖了我的情况。

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

问:如何在Spring数据事务中锁定Entity对象(数据库行)并使其他事务等待?

1 个答案:

答案 0 :(得分:1)

您想要的被称为悲观锁定。通过JPA规范的Spring Data支持这一点。悲观锁定有两种模式:

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

定义锁定时,控件就在您手中。这是悲观锁类型的描述。

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

PESSIMISTIC_READ -使用此模式时,并发事务可以读取锁定行的数据。所有更新都需要获得PESSIMISTIC_WRITE锁定。

除此之外,您可以为锁定交易完成指定超时。