我有一个@Transactional
方法,我在其中使用Spring Data存储库中的findById()
请求记录。
现在,我希望以一种其他@Transactional
方法并行执行的方式来锁定该对象,直到释放该锁为止。
我尝试过的事情:我浏览了@Lock和LockModeType的文档,但仍然不知道是否涵盖了我的情况。
另一种选择是数据库级别的select for update
,但我不确定这是最佳选择。
问:如何在Spring数据事务中锁定Entity对象(数据库行)并使其他事务等待?
答案 0 :(得分:1)
您想要的被称为悲观锁定。通过JPA规范的Spring Data支持这一点。悲观锁定有两种模式:
我认为您正在将事务隔离与锁定混为一谈。通过@Transactional
批注,您可以指定应用于连接的隔离,而通过psirng-data @Locking,可以定义锁定模式。锁定模式与@Transactional
上指定的事务隔离无关。实际上,如果隔离是SERIALIZEABLE的,则您不需要通过JPA或spring-data进行锁定,因为数据库会处理它。在这种情况下,锁将由DB控制。
定义锁定时,控件就在您手中。这是悲观锁类型的描述。
PESSIMISTIC_WRITE -所有事务(包括只读事务)将被阻止,直到持有锁的事务完成为止。不允许脏读。
PESSIMISTIC_READ -使用此模式时,并发事务可以读取锁定行的数据。所有更新都需要获得PESSIMISTIC_WRITE锁定。
除此之外,您可以为锁定交易完成指定超时。