Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate SpringJPA存储库锁定混乱_Hibernate_Jpa_Spring Data Jpa_Optimistic Locking - Fatal编程技术网

Hibernate SpringJPA存储库锁定混乱

Hibernate SpringJPA存储库锁定混乱,hibernate,jpa,spring-data-jpa,optimistic-locking,Hibernate,Jpa,Spring Data Jpa,Optimistic Locking,我对SpringJPA存储库上的锁定工作方式有些困惑,需要对此进行一些澄清 所以,我有一个Spring引导服务,其中我使用hibernate与数据库交互。 在其中一项服务中,我有这样一个实体:- @Entity @Table(name="JUNIPER_SCH_CURRENT_JOB_DETAIL", schema="juniperx") public class JuniperSchCurrentJobDetail { private int currentJ

我对SpringJPA存储库上的锁定工作方式有些困惑,需要对此进行一些澄清

所以,我有一个Spring引导服务,其中我使用hibernate与数据库交互。 在其中一项服务中,我有这样一个实体:-

    @Entity
    @Table(name="JUNIPER_SCH_CURRENT_JOB_DETAIL", schema="juniperx")
    public class JuniperSchCurrentJobDetail {

    private int currentJobSequence;

        ......

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="CURRENT_JOB_SEQUENCE")
    public int getCurrentJobSequence() {
    return currentJobSequence;
    }
    public void setCurrentJobSequence(int currentJobSequence) {
    this.currentJobSequence = currentJobSequence;
    }
    .......
现在,我在上面有一个标记为@repository的存储库,并扩展了JPARepository,如下所示:

   @Repository
   public interface JuniperSchCurrentJobDetailRepository extends 
   JpaRepository<JuniperSchCurrentJobDetail, String> {

   @Query
   public List<Object[]> findLastRunJobDetail(@Param("projectId") 
    String projectId);
@存储库
公共接口JuniperSchCurrentJobDetailRepository扩展
JpaRepository{
@质疑
公共列表findLastRunJobDetail(@Param(“projectId”)
字符串投影);
因此,令人困惑的是,我的一位同事告诉我不要对此表使用@Repository和@Entity,因为所引用的表具有很高的插入率和来自其他应用程序的更新率。使用JPA存储库将锁定此表并导致问题

所以我的问题是:-

1) 在这个微服务中,我只对这个表使用select查询,所以select查询也会锁定这个表吗

2) 从我读到的信息来看,如果我使用乐观锁,它将仅在提交事务时启用锁,但由于此微服务仅读取数据,它还会影响在此表中进行插入和更新的其他服务吗

3) 如果锁定部分正确,是否仍有停止锁定的方法

4) 我可以在这个微服务中读取脏数据,因为它用于填充非实时的仪表板,所以继续使用@repository可以吗?或者我应该将其更改为JDBC模板以避免锁定问题

5) 用@NoRepositoryBean注释类和创建只读存储库是否有帮助

select查询是否也会锁定此表

此微服务仅读取数据,它还会影响在此表中进行插入和更新的其他服务吗

某些数据库在读取表时会在表上创建锁

然而,这完全独立于JPA,并且高度特定于数据库。 您需要查看正在使用的特定数据库,以了解其行为

写入通常会创建锁,至少对于正在写入的行是这样,对于通过外键引用的行也是这样。 某些数据库锁定的行可能比实际写入的行多

如果您使用JPA、JDBC或您选择的任何SQL工具,这也是正确的

从我读到的,如果我使用乐观锁,它将只在提交事务时启用锁

不,乐观锁定不会创建任何超出上述锁定的额外(阻塞)锁定。 不过,在读取和写入行之间发生另一次更新时,可能会使更新失败。 实际上,乐观锁定的目的是防止丢失更新,而不阻止写入(可能还有读取)


总之,我看不出JPA在其默认配置中会如何生成比使用更低级的东西(如
JdbcTemplate

)更多的锁。您不需要在存储库界面上添加
@Repository
注释。这会有什么帮助?抱歉,但需要了解一下。这也能解决锁定问题吗?它不会没有帮助。注释完全是多余的。这就是为什么我将其作为注释而不是答案。因此,这不会因为我使用的是JPARepository而影响其他执行插入和更新的应用程序。。。。?