SpringBoot Mybatis 乐观锁和悲观锁
这里写目录标题
- 1 悲观锁和乐观锁的原理
- 2 悲观锁和乐观锁的应用场景
- 3 悲观锁和乐观锁的总结
- 4 乐观锁
- 5 悲观锁
- 6 使用 Spring Retry 框架
- 6.1 添加依赖
- 6.2 启动类增加注解
- 6.3 业务处理接口
- 6.4 业务实现
1 悲观锁和乐观锁的原理
锁 | 原理 |
---|---|
悲观锁(Pessimistic Lock) | 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 |
乐观锁(Optimistic Lock) | 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。 |
2 悲观锁和乐观锁的应用场景
锁 | 应用场景 |
---|---|
悲观锁 | 比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。 |
乐观锁 | 比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。 |
3 悲观锁和乐观锁的总结
锁 | 总结 |
---|---|
悲观锁 | 写入频繁 |
乐观锁 | 读取频繁 |
4 乐观锁
// 更新中
5 悲观锁
// 更新中
6 使用 Spring Retry 框架
6.1 添加依赖
<!-- Spring 重试 -->
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency><!-- 面向切面 -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId>
</dependency>
6.2 启动类增加注解
package com.xu.spring;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;/*** @author Administrator*/
@EnableRetry
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
6.3 业务处理接口
package com.xu.spring.client.service;/*** @author Administrator*/
public interface RetryService {/*** 业务处理** @param str*/void retry(String str);}
6.4 业务实现
package com.xu.spring.client.service.impl;import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xu.spring.client.entity.Student;
import com.xu.spring.client.mapper.StudentMapper;
import com.xu.spring.client.service.RetryService;
import com.xu.spring.client.service.StudentService;/*** <p>* 服务实现类* </p>** @author hyacinth* @since 2022-03-08*/
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService, RetryService {@Override@Transactional(rollbackFor = Exception.class)@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 3000, multiplier = 1, maxDelay = 10000))public void retry(String str) {// TODO 处理业务throw new RuntimeException("抛出异常模拟任务失败");}@Recoverpublic void recover(Exception e) {System.out.println("处理 maxAttempts 次后还是失败的情况:" + e.getMessage());}}
SpringBoot Mybatis 乐观锁和悲观锁相关推荐
- Springboot整合MyBatis-plus:乐观锁和悲观锁
乐观锁和悲观锁 乐观锁:十分乐观,总是认为不会出现问题,无论干什么都不去上锁,如果出现了问题,再次更新值测试. 悲观锁:十分悲观,总是认为会出现问题,无论干什么都会上锁,再去操作. 一.乐观锁插件 适 ...
- 乐观锁与悲观锁深入学习理解
乐观锁与悲观锁深入学习理解 一.乐观锁和悲观锁 悲观锁 乐观锁 二.两种锁的使用场景 悲观锁 乐观锁 三.乐观锁实现方式 四.乐观锁的缺点 五.总结 参考文献 一.乐观锁和悲观锁 乐观锁和悲观锁并不是 ...
- 共享锁、排他锁、互斥锁、悲观锁、乐观锁、行锁、表锁、页面锁、不可重复读、丢失修改、读脏数据...
作者:T-Birds blog.csdn.net/weixin_36634753/article/details/90815755 共享锁(S锁): 又称为读锁,可以查看但无法修改和删除的一种数据锁. ...
- MyBatisPlus的乐观锁和悲观锁
MyBatisPlus的乐观锁和悲观锁 1.乐观锁 1.1 场景 2.0 乐观锁与悲观锁 3.0 模拟修改冲突 Demo 4.0 通过乐观锁观念解决问题 文章顺序及整体目录可查看(点我即可) 1.乐观 ...
- Mybatis-Plus的乐观锁和悲观锁
乐观锁和悲观锁 如果没看懂.需要看下操作系统 模拟修改冲突 创建数据 CREATE TABLE t_product (id BIGINT(20) NOT NULL COMMENT '主键id',NAM ...
- [锁]:乐观锁、悲观锁与死锁
文章目录 摘要 1 锁的相关概念 1.1 为什么需要锁? 1.2 本地锁 2 乐观锁与悲观 2.1 乐观锁 2.1.1 乐观锁的概念 2.1.2 乐观锁的解决思想 2.1.2.1 数据版本号机制思想 ...
- [初级]深入理解乐观锁与悲观锁
2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔 ...
- 乐观锁与悲观锁——解决并发问题
引言 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失.例如: ...
- [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...
最新文章
- 用Asp.net 传送大文件
- Datawhale组队学习周报(第021周)
- android mysql项目实例_android项目中单实例数据库类
- 【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别
- aspnet_regsql
- Mac - 让NSView快捷的实现阴影效果
- 添加鼠标悬浮在控件上的提示信息 很齐全各种方法 MFC ToolTipCtl
- HSPICE MOS模型
- 微软文字转语音免费下载
- 李沐d2l 环境安装
- 视频教程-C语言-从汇编角度理解C语言的本质-C/C++
- 怎么把pdf电子书转换成txt格式
- Linux 两种终端分屏工具
- 新浪微博上市好故事难讲
- mysql spj_MySQL查询优化器--非SPJ优化--LIMIT优化
- [已修复] CredSSP 加密 Oracle 修复
- python读取文件并复制文件
- 请做好 5 年内随时失业的准备
- 前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现