前言
最近加入了春招的行列中,有好多东西需要学习or复习,在这里将持续整理学习、笔试和面试碰到的一些问题,希望能在巩固知识、加深印象的同时,也给大家的招聘之路带来便利,如果大家遇到了其他的经典问题,但是这里没有收录,希望大家能够通过评论等方式发给我,我会尽快的整理到集锦中。最后希望大家都能如愿找到满意的工作。by CrazyOnes
什么是(数据库)事务?
事务就是一组原子性的SQL查询,或者说一个独立的工作单元。其特点是事务内的语句,要么全部执行成功,要么全部执行失败。其执行结果必须使数据库从一种一致性状态到另一种一致性状态。
事务的特性
事务具有ACID四大特性:
原子性(atomicity): 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作,要么全部提交成功,要么全部失败回滚,不可能只执行事务中的一部分。
一致性(consistency): 数据库总是从一个一致性状态转换到另一个一致性状态。
隔离性(isolation): 一个事务所做的修改在最终提交之前,对其他事务是不可见的。也即事务之间不能相互影响。
持久性(durability): 一旦事务提交,其所做的修改就会永久保存到数据库中。
事务并发所带来的问题
脏读(dirty read): 一个事务读取了另一个事务未提交的数据。
不可重复读(nonrepeatable read): 因为事务从开始到提交之前所做的任何修改对其他事务是不可见的,所以在一个事务中对相同的范围读取两次,结果可能是不同的,因为这些数据可以被其他事务修改。
幻读(phantom read): 当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,这时同一范围内两次读取的结果不同。其与不可重复读的差别在后者是记录的修改,而前者则指的是记录的增加或减少。
事务的隔离级别
事务的隔离级别规定了一个事务中所做的修改,哪些在事务内和事务间是可兼得,哪些是不可见的。
共有以下四种隔离级别:
未提交读(Read Uncommited): 在这个级别中,事务中的修改,即使没有提交,对其他的事务也都是可见的,会引发脏读等全部的事务并发带来的问题。
提交读(Read Commited): 这是大多数数据库默认的隔离级别(但MySQL不是)。提交读就是一个事务从开始到提交之前,所做的任何修改对其他的事务都是不可见的。这也真正满足了前边所提到的隔离性的定义。但仍然无法避免不可重复读和幻读的问题。
可重复读(Repeatable Read): 在事务开始后,其他事务对数据库的修改都是不可见的,直到本事务提交或回滚。该级别保证了同一个事务中多次读取同样的记录结果是一致的,也就解决了不可重复读的问题;但是对于范围读取还是无法解决幻读问题。
可串行化(Serializable): 最高的事务隔离级别。强制所有的事务都以串行的方式执行。会在每一行数据上都加锁,虽然解决了幻读等的所有问题,但是事务的执行速度也最慢。
上边四种隔离级别中,从上到下的隔离级别逐渐增高,但是事务执行的速度也逐渐变慢。隔离级别与带来的问题关系如下:
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
未提交读 | 是 | 是 | 是 | 否 |
提交读 | 否 | 是 | 是 | 否 |
可重复读 | 否 | 否 | 是 | 否 |
可串行化 | 否 | 否 | 否 | 是 |
数据库的索引类型
- BTREE
- 哈希索引
- 空间数据索引
- 全文索引
- 其他索引类型:分型树索引、聚簇索引你、覆盖索引等。