> 文章列表 > Java知识点学习(第15天)

Java知识点学习(第15天)

Java知识点学习(第15天)

事务的基本特性和隔离级别

事务基本特性ACID分别是:
原子性:一个事务的操作那么全部成功,要么全部失败。
一致性:数据库从一个一致性状态转换为另一个一致性状态。比如A转给B100元,假如A只有89元,支付之前数据库中的数据都是符合约束的,但是如果事务执行成功,我们数据的约束就被破坏了,因此事务不能成功,这里我们说事务提供了一致性的保证。
** 隔离性**:一个事务的修改在最终提交前,对其他事务是不可见的。
持久性:一旦事务提价,所有的修改就会永久的保存到数据库中。

隔离性有4个级别,分别是:

  • read uncommit 读未提交,可能会读到其他事务未提交的数据,也叫脏读。用户本来应该读到id = 1的用户的age应该是10,但是读取到了其他事务还没有提交的事务,结果读取到age = 20,这就是脏读。
  • read commit 读已提交,两次读取的结果不一致,叫做不可重复读。不可重复读解决了脏读的问题,它只会读取已经提交的事务。用户开启事务读取id = 1的用户,查到age = 10,再次读取发现结果age = 20,在同一个事务里同一个查询条件读取到不同的结果就是不可重复读。
  • repeatable read 可重复读,这是mysql默认级别,就是每次读取的结果是一样的,但是会造成幻读。用户开启事务查询age = 10的用户数据有5条,过一段时间再查age = 10的用户数据有10条,这就是幻读。
  • serliazable 串行,一般不会使用这种隔离级别,它会给每一行读取的数据加锁,会导致大量的超时和锁竞争问题。

什么是MVCC?

MVCC (Mult-Version Concurrency Control,多版本并发控制)指的就是在使用READ COMITTD、REPEATABLEREAD这两种隔离级别的事务在执行普通的SELECT操作时访问记录的版本链的过程。可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。READCOMMITD、REPEATABLEREAD这两个隔离较别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadvView,而REPEATABLEREAD只在第一次进行普通SEECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。

简述MyISAM和InnoDB的区别?

MyISAM

  • 不支持事务,但是每次查询都是原子的。
  • 支持表级锁,即每次操作都是对整个表加锁。
  • 存储表的总行数。
  • 一个MyISAM表有三个文件:索引文件、表结构文件、数据文件。
  • 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引和主索引基本一致,但是辅索引不用保证唯一性。

InnoDB

  • 支持ACID事务,支持事务的四个隔离级别。
  • 支持行级锁及外键约束;因此支持写并发。
  • 不存储总行数。
  • 一个InnoDB引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可以分布在多个文件中),也有可能为多个(设置为独立表,表大小受到操作系统文件大小限制,一般为2G),受操作系统文件大小限制。
  • 主键的索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;因此最好使用自增主键,防止插入数据时,为维护B+树结构,文件的大量调整。

Explain语句结果中各个字段分别表示什么?

列名 描述
id 查找语句中出现一个SELECT关键字,MYSQL会为它分配 一个唯一的id值,某些子查询会被优化为join查询
select_type SELECT关键词对应的查询类型
table 表名
partitions 匹配的分区信息
type 针对单表的查询方式(全表扫描、索引)
possible_keys 可能用的索引
key 实际用到的索引
key_len 实际使用到的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估需要读取的记录条数
filtered 某个表经过搜索条件后过滤后剩余记录条数的百分比
Extra 一些额外的信息,比如排序等

索引覆盖是什么?

索引覆盖就是在一个SQL的执行中,可以利用索引来快速查找,并且此SQL所要查询的字段在当前索引对应的字段中都包含了,那么就表示此SQL走完索引后就不用回表查询了,所有的字段都在当前索引的叶子节点上存在,就可以直接作为结果返回了。

最左前缀原则是什么?

当一个SQL想要利用索引时,就一定要提供该索引所对应的字段中的最左边的字段,也就是排在最前面的字段,比如针对a,b,c三个字段一个联立索引,那么在写一个sql时就一定要提供a字段的条件,这样才能使用联立索引,这是由于在联立a,b,c索引时,底层的B+树是按照a,b,c三个字段从左向右去比较大小进行排序的,所以如果想要利用B+树进行快速查找也符合上述的规则。