SpringBoot集成JPA的乐观锁插件(5)

乐观锁是一种用于并发控制的机制,防止数据在高并发场景下出现不一致的情况。通过引入version字段,当多个用户尝试更新数据时,只有version匹配的更新才能成功。本文通过一个例子介绍了乐观锁的工作原理,并展示了在Spring Data JPA中使用乐观锁进行数据更新的示例,帮助理解如何避免并发操作导致的数据覆盖问题。
摘要由CSDN通过智能技术生成

1.概述

        首先我们讲述一下啥是乐观锁。乐观锁呢是在并发操作时,用来保证数据库的数据安全来设立的一种机制。举个例子,账户里面原本有1000元,张三要往里面存300元,李四要往里面存400元,按理说操作结束后,账户里应该有1700元。但是如果不用乐观锁,会出现下面这种情况:张三和李四同事对数据进行查询,他们都会显示是1000元,然后各自进行操作,这时候如果李四的操作慢一点呢,张三先把数据改成1300,然后李四又把1400放进数据库,张三的数据就会被覆盖掉。
        这个时候引进了乐观锁的机制,他在数据库的表中设立了一个version字段,当张三和李四取数据的时候,随便把version取出来,两个人同时取到数据1000,version是1。当张三把数据修改完填回去,顺便会把version加1,此时就是2。李四修改完后发现,version和自己取数据时候的1不一样, 他就知道有人修改了数据。这就是基本原理,实现如下:

2.快速入门

1.导依赖(不需要导入依赖),但是需要提前导入jpa的依赖

2.实体类

3.Dao层

import com.guguo.Entity.Traveler;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TravelerDao extends JpaRepository<Traveler,Integer> {
}

4.Controller层

乐观锁比较的两个版本是在进行save操作时候的,数据库中version的版本和save方法中对象的version版本是不是一致

    //修改数据
    @GetMapping("/updateTraveler")
    public void updateTraveler() throws InterruptedException {
        Traveler traveler = travelerDao.findById(4).get();
        traveler.setGmtModified(new Date());
        //如果在这10秒内,你对数据库没有任何操作,那么下面的那条save语句就能执行成功。
        // 但是如果在这10秒内,修改了数据库的version字段,那么下面的save方法就会报错
        Thread.sleep(10000);
        travelerDao.save(traveler);
    }

 就报的这个错。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值