【发布时间】:2019-03-30 13:42:51
【问题描述】:
我正在使用弹簧数据。现在我的任务是在应用程序的性能和数据一致性非常关键的部分更新实体。实体中有 isLocked 字段。许多事务和业务逻辑都在这个领域中继。我希望能够以最有效和最安全的方式更新此字段。
我看到了两种方式:
使用
@Query和 jpql 更新语句。这种方法有利于只对 db 执行一个请求。但我不确定交易安全。在 java 中使用
findById和@Lock(LockModeType.PESSIMISTIC_WRITE)并修改字段。这种方法的缺点是至少向 db 发出 2 个请求,但由于锁定,跨国安全。
你会推荐什么?也许有不同的最合适的方法我不知道。
【问题讨论】:
-
您只是在使用普通交易吗?
@Transactional几乎总是足够的(尽管如果由于某些令人惊讶的原因您手头没有对象,那么直接执行更新就不需要先获取它)。 -
我使用
@Transactional。我想知道为什么有这么多在 java 端更新的例子。使用@Query更新更有效,不是吗? -
它更效率,但是您必须编写查询并显式执行它们,而 JPA 的重点是您可以使用 POJO 编写普通的 Java 代码,而不必担心数据库细节。
-
所以 jpql 数据库也是不可知的。
标签: java spring jpa spring-data-jpa spring-data