java - Spring 数据 : How to lock a row in a transaction and make other transactions wait until it is released?

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

我有一个 @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/

相关文章:

java - 字符串片段需要替换为 '<'

spring - 在MVC中,数据是如何从JSP传递到Controller的?

java - Spring Boot Web无法将嵌套的json解析为对象

spring - 如何使用 spring data jpa 查询 jsonb 列?

Javascript Eclipse 提案不显示 onclick

java - 如何找到字符串中第一组不包含重复字符的字符

java - Spring boot中如何获取请求的url

Spring 数据 JPA 和 Spring 数据 Elasticsearch ;找不到类型的属性索引?

java - 使用 spring data JPA 异步查询的结果

java - Android本地VPN服务: can't get response