网站开发会议议程范文,如何用 ftp上传网站,公众号怎么挣钱,国内最好的在线网站建设目录 引言1. 逻辑删除1.1 概述1.2 逻辑删除的优势1.3.为什么使用逻辑删除1.4 综合案例 2. 乐观锁和悲观锁2.1.什么是乐观锁和悲观锁2.2.乐观锁和悲观锁的区别2.3.综合案例 3. 分页插件总结 引言
在现代软件开发中#xff0c;数据库操作是不可或缺的一环。为了提高系统的性能、… 目录 引言1. 逻辑删除1.1 概述1.2 逻辑删除的优势1.3.为什么使用逻辑删除1.4 综合案例 2. 乐观锁和悲观锁2.1.什么是乐观锁和悲观锁2.2.乐观锁和悲观锁的区别2.3.综合案例 3. 分页插件总结 引言
在现代软件开发中数据库操作是不可或缺的一环。为了提高系统的性能、安全性以及数据一致性开发者需要深入了解一些高级的数据库操作技术。本篇博客将深入探讨三个重要的数据库操作技术逻辑删除、乐观锁和分页插件。通过深度讲解这些技术读者将能够更好地应对实际项目中的复杂场景。
1. 逻辑删除
1.1 概述
MyBatis-Plus中的逻辑删除Logical Delete是在数据库中进行虚拟删除即实际删除数据时并不会将数据从数据库中删除而是通过一个标记来记录其已被删除。这种删除方式称为逻辑删除或软删除。
1.2 逻辑删除的优势
逻辑删除相比物理删除具有以下优势
数据恢复 可以方便地通过修改记录的状态来实现数据的恢复而无需进行繁琐的数据库恢复操作。
历史记录 可以保留数据删除的历史记录方便日后审计和分析。
1.3.为什么使用逻辑删除
当我们使用物理删除时数据将被永久删除无法恢复。但有些情况下我们并不希望永久删除数据比如用户误删除、操作失误等情况这时逻辑删除就尤为重要。
另外逻辑删除还可以对应业务层逻辑将数据状态标志为“已删除”便于后续查询和统计。同时逻辑删除还能提高删除操作效率减少物理删除数据对系统性能的影响。
1.4 综合案例
配置yml global-config:db-config:logic-delete-field: state# 全局逻辑删除的实体字段名 logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)数据表增加字段state 实体类添加对应的字段state(与yml的要一致)
TableField()private intstate;此时使用mybatisplus删除就会把state从0变为1之后查询只会显示未0的 id为1的state字段0改为1 此时id为1已经逻辑删除掉了
2. 乐观锁和悲观锁
2.1.什么是乐观锁和悲观锁
乐观锁 Optimistic Locking 和悲观锁是数据库中的两种并发控制机制。
乐观锁假定数据一般情况下不会发生冲突因此在读取数据时不会对其加锁而是在写入时先比较数据版本号比如时间戳是否相同再进行操作。如果版本号相同则表示该数据没有被其他进程修改可以进行写操作如果版本号不同则表示该数据已经被其他进程修改写操作会失败需要重新读取数据进行操作。 乐观锁是为了解决并发过程中数据更新冲突的问题乐观锁能提高并发过程中的程序吞吐量。 悲观锁则假定数据会发生冲突因此在读取数据时就会对其加锁防止其他进程同时修改此数据直到当前进程操作完成并解锁后其他进程才能再次操作该数据。
2.2.乐观锁和悲观锁的区别
乐观锁和悲观锁的区别主要有以下几点
加锁时间不同乐观锁在读取数据时不会对其加锁而是在写入时进行比较和加锁操作悲观锁在读取数据时就会对其加锁。冲突处理方式不同乐观锁会在写入时进行比较和冲突检测如果版本号不一致则操作失败需要重新读取数据悲观锁则会阻塞其他进程对该数据的访问直到当前进程完成操作并解锁。适用场景不同乐观锁适用于并发量比较小、数据量比较大、操作更多为读取的场景悲观锁适用于并发量比较大、数据量比较小、操作更多为写入的场景。
总的来说乐观锁适用于并发冲突较少的场景可以提高系统的并发性悲观锁适用于并发冲突较多的场景可以保证数据的一致性和安全性。
2.3.综合案例
使用数据版本(Version)记录机制实现乐观锁这是乐观锁最常用的一种实现方式。 在表中添加一个version字段,默认值为1 实体类上添加Version注解
Versionprivate Integer version;导入插件
package com.yuan.ttx.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// Spring Boot 方式
Configuration
public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}然后Controller中 这个是可行的先查询在修改然后version11 上面代码就被乐观锁锁住了对同一个对象操作查询后没修改又查询再修改此时Version没有进行1任然是2然后最后的结果是第一个成功第二个不成功
3. 分页插件
在类中添加下面代码 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
package com.yuan.ttx.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// Spring Boot 方式
Configuration
public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}使用
RequestMapping(/sel)public Object sel(Long p){PageBook page1 new Page(p,5);PageBook res iBookService.page(page1);return res.getRecords();}第二页的数据 用QueryWrapper带条件查询分页 RequestMapping(/sel)public Object sel(Long p,String name){QueryWrapperBook wrapper new QueryWrapper();wrapper.like(StringUtils.isNotEmpty(name),bookname,name);PageBook page1 new Page(p,5);PageBook res iBookService.page(page1,wrapper);return res.getRecords();}总结
通过本篇博客的学习读者深入了解了逻辑删除、乐观锁和分页插件这三个高级数据库操作技术。逻辑删除为数据的保留和恢复提供了便捷的方式乐观锁解决了高并发场景下的数据一致性问题而分页插件使得处理大数据集合更为高效。在实际项目中灵活运用这些技术将使系统更加稳健、高效。