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);
}
就报的这个错。。。