美文网首页
【快学springboot】8.JPA乐观锁Optimistic

【快学springboot】8.JPA乐观锁Optimistic

作者: 哈皮呀 | 来源:发表于2019-05-12 18:38 被阅读0次

    简书停更

    本人主要在头条号写文章,可以关注我的头条号【happyjava】,或者收藏我的个人博客happy的博客blog.happyjava.cn

    介绍

    当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的。为此,我们可以使用Java Persistence API提供的乐观锁定机制。它导致在同一时间对同一数据进行多次更新不会相互干扰。为了使用OptimisticLocking,我们需要一个实体(Entity),其中包含一个带有@Version注释的属性。在使用它时,每个读取数据的事务都持有version属性的值。在事务想要进行更新之前,它将再次检查version属性。如果值在此期间发生了更改,则抛出ObjectOptimisticLockingFailureException。否则,事务提交update并递增version的值。这种机制适用于读操作比更新或删除操作多得多的应用程序。

    新建一个UserEntity.java

    @Entity
    @Table(name = "user")
    @Data
    @OptimisticLocking
    public class User {
    
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     private Integer id;
    
     @Column(name = "username", unique = true, nullable = true, length = 50)
     private String username;
    
     private String password;
    
     @Version
     private Integer version;
    
     @PrePersist
     public void prePersist() {
     version = 0;
     }
    
    }
    

    spring data jpa在上一篇文章已经做过一些讲解了【快学springboot】7.使用Spring Boot Jpa。感兴趣的朋友可以看看。这里定义了一个version字段,使用了Version注解标识。PrePersist这个注解表示在新增数据之前执行。

    新建UserRepo接口

    public interface UserRepo extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {
     
    }
    

    新建一个UserTest类,继承SpringbootApplicationTests

    public class UserTest extends SpringbootApplicationTests {
     
    }
    

    SpringbootApplicationTests这个类是使用Spring initialize新建项目的时候自动生成的用来做单元测试的类。在UserTest上注入UserRepo,并且写一个新增user的单测。

    【快学springboot】8.JPA乐观锁OptimisticLocking

    执行之后查看数据库。

    【快学springboot】8.JPA乐观锁OptimisticLocking

    该记录已经被创建出来了。

    测试update该记录

    【快学springboot】8.JPA乐观锁OptimisticLocking

    执行后查看数据库:

    【快学springboot】8.JPA乐观锁OptimisticLocking

    可以看到version字段自增了1。

    测试JPA乐观锁

    新建一个方法,如下

    【快学springboot】8.JPA乐观锁OptimisticLocking

    这里查询了两次id为1的记录,然后分别更新了这条记录。根据前面的描述,这里会抛出一个ObjectOptimisticLockingFailureException异常。启动测试,结果如下:

    【快学springboot】8.JPA乐观锁OptimisticLocking

    这是符合预期的。看下数据库的version,在这种情况下,我们的预期结果是version变为2。

    【快学springboot】8.JPA乐观锁OptimisticLocking

    通过数据库的值查看,测试都是符合预期的。

    去掉User的OptimisticLocking注解

    我们把User实体的OptimisticLocking注解去掉,然后再次执行上面的方法。

    【快学springboot】8.JPA乐观锁OptimisticLocking

    这一次程序顺利执行了,然后查看下数据库的记录:

    预期应该是version会变为3,然后username变为happyjava-new2。

    【快学springboot】8.JPA乐观锁OptimisticLocking

    通过结果来看,这是符合预期的。

    总结

    spring data jpa通过OptimisticLocking实现了乐观锁,该乐观锁不是通过数据库自身去实现的,它是通过version字段(需要Version注解标识)去实现的。如果update的数据时候,发现数据库的version大于等于当前的version,则会抛出ObjectOptimisticLockingFailureException,错误信息是

    Row was updated or deleted by another transaction 
    

    相关文章

      网友评论

          本文标题:【快学springboot】8.JPA乐观锁Optimistic

          本文链接:https://www.haomeiwen.com/subject/ivxhaqtx.html