我有一个 @Transactional
方法,我在其中使用 findById()
从 Spring Data 存储库请求记录。
现在我想以一种方式锁定这个对象,其他 @Transactional
方法如果并行执行将等待直到释放锁。
我尝试了什么: 我浏览了 @Lock 的文档和 LockModeType但我仍然无法弄清楚它是否涵盖了我的情况。
另一种选择是数据库级别的select for update
,但我不确定这是最佳选择。
问:如何在spring数据事务中锁定一个Entity对象(db行)让其他事务等待?
最佳答案
你想要的是悲观锁定。通过 JPA 规范的 Spring Data 支持这一点。有两种可用的悲观锁定模式:
我认为您混淆了事务隔离和锁定。通过 @Transactional
注解你可以指定应用到连接的隔离,而通过 spirng-data @Locking 你可以定义锁定模式。 Lock 模式与 @Transactional
上指定的事务隔离无关。实际上,如果隔离是可串行化的,则您不需要通过 JPA 或 spring-data 进行锁定,因为数据库会处理它。在这种情况下,锁将由数据库控制。
当您定义锁定时,控制权就在您手中。下面是对悲观锁类型的描述。
PESSIMISTIC_WRITE - 所有事务(包括只读事务)都将被阻止,直到持有锁的事务完成。不允许脏读。
PESSIMISTIC_READ - 当你有这个模式时,并发事务可以读取锁定行的数据。所有更新都需要获得PESSIMISTIC_WRITE锁。
除此之外,您还可以指定锁定事务完成的超时时间。
关于java - Spring 数据 : How to lock a row in a transaction and make other transactions wait until it is released?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902108/