Springboot和Mysql

springboot

解耦是一种很好的设计规范。Dao层负责解析数据,那么在service层里面,我们就需要new来自Dao层的实例对象来进行方法的调用。同理在Controller层我们需要new来自service层的对象,这样做如果后续DaoController层的实现发生改变时,那么调用这两个的实例对象也需要修改。在spring里面也提供了解耦的方法,就是上交管理权限和容器注入。

new实例对象的操作交给spring来使用,这样spring就会使用容器来管理存储这些对象,并在使用时通过调用容器的方式来传递参数。

解耦

将需要解耦的类使用Component,需要管理的对象使用AutoWired来进行注解。并且,为了更好的标注Component的作用,还衍生出了这些类的不同注解,例如:

  • @Service:注解服务层
  • @Controller:注解控制层
  • @Repository:数据访问类

Mysql

Mysql中,现在来总结一下事务和索引这两个不太熟悉的概念。

事务

只有InnodeDB支持事务,其它类型的数据库均不支持。

事务可以理解为一把锁。除此之外,当事物执行失败的时候,它还支持回归事物,即如果某条sql语句执行失败,那么可以通过事务回滚来回到执行前的状态。

一些八股

数据库为了解决并发场景提出了事务的概念,而事务包括下面几个特点

  • 原子性(A)

    事务要么提交成功,要么提交失败后回滚,不存在事务中某一部分的值成功修改,而一部分值没有发生修改。其中失败回滚是通过日志系统来完成的,即在修改数据前先把旧的数据写入undo_log里面,当需要失败回滚时,就可以把数据还原。

  • 一致性(C)

    一致性是指事务确保了数据的合理性和正确性。合理性是指值的变量在一个合理的范围内

  • 隔离性(I)

    不同事务之间存在隔离性,并且隔离性也分等级,隔离等级越高,并发效果越好,但是效率越差。

  • 持久性(D)

    数据库就是专门为持久化数据而准备的

在此,我们用两个事物A,B来分析一下可能出现的情况。

脏读

顾名思义,脏读就是读取了一个错误的数据。

假设一种情况,事务A修改了一些数据,但是还未来得及提交,此时事务B再读这些数据就是发生了脏读。

幻读

幻读也是发生在查询数据之间的,例如在事务A里面我们要进行查询数据,在两条查询语句之间,事务B插入了新的数据;

这会导致A查询出来的数据前后结果不一致,注意,幻读一般指查询的集合前后不一致,也就是查询出来的行数前后不同。

不可重复读

与幻读相似,不过一般指的是某个值而并非某一行数据不可重复读。

索引

索引是为了加快查询速度而抽象出来的一种数据结构。其中索引使用的数据结构是B+树。

B+ 树

B+树是一种特殊的数据结构,其数据全部存储在叶子结点,而非叶子结点存储的是下一级的物理地址,与B树不同的的地方有

  • B+树的数据只在叶子结点保存
  • 其叶子结点是双向链表连接
  • 查询效率高

但是本质上还是空间换时间的机制来加快查找速度。

mysql中,primary key以及unique值会自动创建索引,也就是默认索引,根据索引来查询数据的效率是最高的。

下面是创建索引的sql语句

1
create index idx_user_name on user(name)

一般创建的索引命名如下

idx是代之索引indexuser是表名,name是根据哪个字段创建索引,意思就是给user表的name字段创建一个索引。

Licensed under CC BY-NC-SA 4.0
花有重开日,人无再少年
使用 Hugo 构建
主题 StackJimmy 设计