介绍
当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的。为此,我们可以使用Java API提供的乐观锁定机制。它导致在同一时间对同一数据进行多次更新不会相互干扰。为了使用,我们需要一个实体(),其中包含一个带有@注释的属性。在使用它时,每个读取数据的事务都持有属性的值。在事务想要进行更新之前,它将再次检查属性。如果值在此期间发生了更改,则抛出。否则,事务提交并递增的值。这种机制适用于读操作比更新或删除操作多得多的应用程序。
新建一个.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; } }
data jpa在上一篇文章已经做过一些讲解了【快学】7.使用 Boot Jpa。感兴趣的朋友可以看看。这里定义了一个字段,使用了注解标识。这个注解表示在新增数据之前执行。
新建接口
public interface UserRepo extends PagingAndSortingRepository, JpaSpecificationExecutor { }
新建一个类,继承
public class UserTest extends SpringbootApplicationTests { }
这个类是使用 新建项目的时候自动生成的用来做单元测试的类。在上注入,并且写一个新增user的单测。
执行之后查看数据库。
该记录已经被创建出来了。
测试该记录
执行后查看数据库:
可以看到字段自增了1。
测试JPA乐观锁
新建一个方法,如下
这里查询了两次id为1的记录,然后分别更新了这条记录。根据前面的描述,这里会抛出一个异常。启动测试,结果如下:
这是符合预期的。看下数据库的,在这种情况下,我们的预期结果是变为2。
通过数据库的值查看,测试都是符合预期的。
去掉User的注解
我们把User实体的注解去掉,然后再次执行上面的方法。
这一次程序顺利执行了,然后查看下数据库的记录:
预期应该是会变为3,然后变为-new2。
通过结果来看,这是符合预期的。
总结
data jpa通过实现了乐观锁,该乐观锁不是通过数据库自身去实现的,它是通过字段(需要注解标识)去实现的。如果的数据时候,发现数据库的大于等于当前的,则会抛出,错误信息是
Row was updated or deleted by another transaction
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666