mysql 数据库面试题

数据库中的事务是什么,MySQL中是怎么实现的
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。 

前面讲的重做日志,回滚日志以及锁技术就是实现事务的基础。
事务的原子性是通过 undo log 来实现的
事务的持久性性是通过 redo log 来实现的
事务的隔离性是通过 (读写锁+MVCC)来实现的
而事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!
原子性,持久性,隔离性折腾半天的目的也是为了保障数据的一致性!
总之,ACID只是个概念,事务最终目的是要保障数据的可靠性,一致性。

MySQL事务的特性?
事务特性: 

1、原子性:即不可分割性,事务要么全部被执行, 要么就全部不被执行。

2、一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态。

3、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。

4、持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

数据库事务的隔离级别? 默认事务隔离级别?
隔离性是事务ACID特性里最复杂的一个。在SQL标准里定义了四种隔离级别,每一种级别都规定一个事务中的修改,哪些是事务之间可见的,哪些是不可见的。
级别越低的隔离级别可以执行越高的并发,但同时实现复杂度以及开销也越大。
Mysql 隔离级别有以下四种(级别由低到高):
○ READ UNCOMMITED (未提交读)
○ READ COMMITED (提交读)
○ REPEATABLE READ (可重复读)(默认的事务隔离级别)
○ SERIALIZABLE (可重复读)
数据库事务的隔离级别解决了什么问题?
只要彻底理解了隔离级别以及他的实现原理就相当于理解了ACID里的隔离性。那么隔离性是要做到什么呢? 隔离性是要管理多个并发读写请求的访问顺序。这种顺序包括串行或者是并行。
脏读,幻读,不可重复读的定义
脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。 

幻读和不可重复读是两个容易混淆的概念,幻读是指读到了其他已经提交事务的新增数据;不可重复读是指已经提交事务的更改数据(更改或删除)。
https://blog.csdn.net/bobozai86/article/details/110147719
6. MySQL怎么实现可重复读?
为什么会产生不可重复读?
这跟 READ COMMITTED 级别下的MVCC机制有关系,在该隔离级别下每次 select的时候新生成一个版本号,所以每次select的时候读的不是一个副本而是不同的副本。
在每次select之间有其他事务更新了我们读取的数据并提交了,那就出现了不可重复读

REPEATABLE READ(Mysql默认隔离级别)
在一个事务内的多次读取的结果是一样的。这种级别下可以避免,脏读,不可重复读等查询问题。mysql 有两种机制可以达到这种隔离级别的效果,分别是采用读写锁以及MVCC。
采用读写锁实现:

为什么能可重复度?只要没释放读锁,在次读的时候还是可以读到第一次读的数据。
优点:实现起来简单
缺点:无法做到读写并行
采用MVCC实现:

为什么能可重复度?因为多次读取只生成一个版本,读到的自然是相同数据。
优点:读写并行
缺点:实现的复杂度高
但是在该隔离级别下仍会存在幻读的问题,关于幻读的解决我打算另开一篇来介绍。
7. 数据库第三范式和第四范式区别?
第三范式:在二范式的基础上,不存在元素之间的传递函数依赖,则满足第三范式。

MySQL的存储引擎?
存储引擎:存储数据,为存储的数据建立索引,更新、查询数据。 

2.因为在关系数据库中数据以表的形式存储,所以,存储引擎也可以称为表类型。

3.查看当前MySQL数据库支持的存储引擎:show engines;或者show variablkes like ‘have%’;。

4.InnoDB存储引擎:
①是MySQL默认支持的数据库引擎。
②是事务安全的。
③支持外键。
④InnoDB存储引擎的表支持全文索引,大幅提升了InnoDB存储引擎的文本检索能力。
⑤InnoDB表空间分为共享表空间、独享表空间。
⑥适用场景:需要事务支持、行级锁定对高并发有很好地适应能力,但需要确保查询是通过索引完成、数据更新较为频繁。

5.MyISAM存储引擎:
①是老版本MySQL默认存储引擎。
②基于传统的ISAM类型。
③具有检查和修复表格的大多数工具。
④MyISAM表格可以被压缩,而且支持全文索引。
⑤不是事务安全的。
⑥不支持外键。
⑦不支持行级锁,支持表级锁。
⑧适用场景:不需要事务支持、并发相对较低、数据修改相对较少、以读为主、数据一致性要求不是特别高。

6.MEMORY存储引擎:
①将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。
②适用于存储临时数据的临时表,以及数据仓库中的纬度表。

MySQL数据库使用MEMORY存储引擎作为临时表来存放查询结果集。

③默认使用哈希索引。
④只支持表锁。
⑤并发性能较差。
⑥不支持text和blob列类型。
⑦会浪费内存,比如:存储变长字段(varchar)时是按照定长字段(char)的方式进行的。

MyISAM和InnoDB的区别:
Ⅰ.InnoDB支持事务,而MyISAM不支持事务。
Ⅱ.InnoDB支持外键,而MyISAM不支持外键。
Ⅲ.InnoDB是行锁,而MyISAM是表锁(每次更新增加删除都会锁住表)。
Ⅳ.InnoDB和MyISAM的索引都是基于b+树,但他们具体实现不一样,InnoDB的b+树的叶子节点是存放数据的,MyISAM的b+树的叶子节点是存放指针的。
Ⅴ.InnoDB是聚簇索引,必须要有主键,一定会基于主键查询,但是辅助索引就会查询两次。MyISAM是非聚簇索引,索引和数据是分离的,索引里保存的是数据地址的指针,主键索引和辅助索引是分开的。
Ⅵ.InnoDB不存储表的行数,所以select count( * )的时候会全表查询。而MyISAM会存放表的行数,select count(*)的时候会查的很快。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

消失在人海中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值