Hibernate SpringJPA存储库锁定混乱
我对SpringJPA存储库上的锁定工作方式有些困惑,需要对此进行一些澄清 所以,我有一个Spring引导服务,其中我使用hibernate与数据库交互。 在其中一项服务中,我有这样一个实体:-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
@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而影响其他执行插入和更新的应用程序。。。。?