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锁。
除此之外,您还可以指定锁定事务完成的超时时间。
我有一个 @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锁。
除此之外,您还可以指定锁定事务完成的超时时间。