数据库在Java工程师的面试过程中也是常问的一项,这里主要对数据库原理,MySQL,Redis相关问题进行了总结
事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。是满足ACID特性的一组操作。
A:Automic,原子性,事务的所有操作要么全部提交成功,要么全部失败回滚。
C:Consistency,一致性,事务应确保数据库的状态从一个一致状态转变为另一个一致状态。
I:Isolation,隔离性,多个事务并发执行时,一个事务的执行不会影响其他事务的执行。
D:Durability,持久性,已被提交的事务对数据库的修改应该永久保存在数据库中。
丢失修改
读脏数据
不可重复读
幻影读
Read Uncommitted(读取未提交):
Read Committed(读取已提交):
Repeatable Read(可重复读):
Serializable(串行化):
MySQL的默认隔离级别是
MySQL支持的引擎在5.5版本前默认为MyISAM,之后默认为InnoDB
区别在于:
1.InnoDB支持的行级锁,而MyISAM支持的是表级锁
2.InnoDB支持事务,而MyISAM不支持事务
3.InnoDB支持外键,而MyISAM不支持外键(外键用于与另一张表关联,是另一张表的主键)
4.InnoDB支持MVCC(多版本并发控制机制),MyISAM不支持
最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入MVCC之后,只有写写之间相互阻塞,其他三种操作都可以并行,
这样大幅度提高了InnoDB的并发度。MVCC比单纯的加锁更高效,MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作,
MVCC可以使用乐观锁和悲观锁来实现。其具体实现方式是保存数据在某个时间点的快照实现的,不同存储引擎的实现方法是不同的
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。
这里的时间指的是系统版本号。比如InnoDB查询每行数据,必须确保两个标准
1.数据行的版本必须小于等于当前事务的版本 2.行的删除操作的版本一定是未定义的或者大于当前事务的版本号
5.InnoDB使用的是聚簇索引,而MyISAM使用的是非聚簇索引
聚簇索引指的是数据就存储在叶子节点上,而非聚簇索引叶子节点存储的不是数据本身,而是数据存放的地址。
6. MySQL的最左匹配原则
在MySQL建立联合索引的时候会用到最左匹配原则,即最左优先,在查询的时候会从联合索引的最左边开始匹配
有的公司是会考察这个的,会出一些相应的题目,但基本都是力扣上数据库的题的一些变式甚至是原题, 建议把力扣数据库的题刷一遍,非会员能做的就二十来个,面试官问的也基本在这里面