当前位置: 首页 > 知识库问答 >
问题:

Spring JPA锁

金旺
2023-03-14

当涉及到在spring JPA中锁定时,我真的不安全。
所以请将此问题视为一个澄清。我真的希望我理解的正确,但我的英语不太好理解复杂的博客文章。
所以这是我想我从一些文章中得到的:

锁定有两种基本类型:

    null
    null

为什么现在会有这么多的分锁,分锁是做什么的?当“optimatic”是我试图理解的顶部的乐观锁时,那么“optimistic_force_incement”是什么?
版本更新与此有什么关系?(还是@version?)

继续:
锁在Spring JPA中有三种基本用法:

>

  • 在普通列上,例如:

    @Entity
    public class PersonEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Lock(LockModeType.PESSIMISTIC_WRITE)
        private String name;
    }  
    
    @Entity
    public class PersonEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Lock(LockModeType.PESSIMISTIC_WRITE)
        @OneToOne
        private Group group;
    }  
    

    在存储库中的表上,例如:

    interface PersonRepository extends Repository<Person, Long> {
        @Lock(LockModeType.PESSIMISTIC_WRITE)
        Person findOne(Long id);
    }  
    

    使用直接锁定实体

    @Entity
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    public class PersonEntity { }
    

    是不可能的。因此,您可以使用3(在存储库内部锁定)。

    @Transactional
    public void test(){
        System.out.println("start, but not locked yet");
        PersonEntity person1 = personRepository.findOne(1L); // locks this person or must wait, when locked
        System.out.println("now locked");
        // do something
        return true; // now the lock will be deleted -> unlocked again
    }  
    
    public void test(){
        System.out.println("start, but not locked yet");
        PersonEntity person1 = personRepository.findOne(1L); // locks this person or must wait, when locked
        System.out.println("now locked");
        // do something
        person1 = null; // now the lock will be deleted -> unlocked again
        System.out.println("not locked anymore");
        // do something more
        return true;
    }  
    

    最后一句话:
    我真的希望我不会惹恼别人。但就像我说的:我真的很难理解英语中如此复杂的结构:(
    所以非常感谢你们的帮助:)我真的很感激你们的帮助。不管你给我的链接是为了更多的理解还是直接回答我的问题:)

  • 共有1个答案

    邢法
    2023-03-14

    锁定

    锁定用于防止脏读取(读取尚未提交的数据)和不可重复读取(读取在一个读取完成之前被另一个事务删除的数据)。

    乐观

    悲观的写作

    强制序列化更新的排他锁。在乐观锁定仅保存状态的情况下,它被锁定以防止并发操作发生事务失败/死锁的情况。

    悲观写力增量

    类似于它的乐观对应物,一个更新对象版本的悲观写。为非版本化对象引发异常。

     类似资料:
    • 我开始制作一个简单的spring boot应用程序。 我的第一步是利用Spring JDBC支持,使用默认的H2内存数据库。对于示例数据,我在src/main/resources中有schema.sql和data.sql。 所以当spring启动时,它也会执行这两个脚本并填充H2数据库,我可以通过H2控制台访问它。

    • 我仍然是java和spring的初学者,我已经在mysql中存储了一个名为< code>Offers的表,我试图逐行获取数据< code >其中Status == 0,我的表看起来像这样: 当我尝试运行我的代码时,它的返回 org.springframework.beans.factory。BeanCreationException:创建在类路径资源[org/springframework/boo

    • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

    • 我试图构建一个基于wicket、Spring jpa存储库和MySQL的应用程序。 问题是,我的Service类只是不想自动配线。如果我想使用自动配线的类,我有一个空指针异常。 事实上,我得到了双空指针:我的BaseServiceConfig。java不会自动连接实现,itnerface中的自动连接存储库也为空。所以,问题是为什么。 我试图用最少甚至没有xml的方式实现这一点,所有的配置都是在ja

    • 我正在使用Spring MVC/Security/JPA/Hibernate开发一个web应用程序。 我有一个用户类,它与UserRole有一个omany关系。 UserRole类与用户之间有很多关系。 用户存储库界面非常简单。 当我使用下面的代码片段使用存储库加载用户信息时,它会很好地检索用户和用户角色数据。 这是日志文件。 然而,问题出在这里。 如果我使用UserRepository的save

    • 在我的Spring Boot应用程序中有POJO,下面是它的样子: 现在我想选择所有与给定值相关的方式是POJO的成员。 所以这是我的查询

    • 我试图写这个来获取列表,我必须将ID列表作为参数传递: 我的实体是我用来查询的实体是: 但我在运行后遇到了以下异常: 有人能帮我用上面的方法获取列表吗?或者能告诉我我在这方面做错了什么。我不想使用本机,即(nativeQuery=true)使用这个。

    • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗