mysql面试

📅 2026/7/31 17:40:34
mysql面试
事物的四个特征ACID原子性(Atomic) 事务中的所有操作要么全都执行要么全都不执行。一致性(Consistency)事务前后数据的完整性必须保持一致。比如A向B转账不可能A扣了钱B却没收到。隔离性(Isolation)并发的事务之间不会相互影响持久性(Durability)一旦事务提交之后所做的修改将会永久保存在数据库上。隔离并发问题丢失更新Lost Update。当两个或多个事务选择同一行最初的事务修改的值会被后面的事务修改的值覆盖。脏读Dirty Reads一个事务读取了另一个事务修改了但是未提交的数据。不可重复读Non-Repeatable Reads一个事务读到另一个事务已提交的数据update。事务 A多次读取同一数据事务 B 在事务A多次读取的过程中对数据作了更新并提交导致事务A多次读取同一数据时结果 不一致。幻读Phantom Reads一个事务读到另一个事务已提交的数据insert。系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级但是系统管理员B就在这个时候插入了一条具体分数的记录当系统管理员A改结束后发现还有一条记录没有改过来就好像发生了幻觉一样这就叫幻读。隔离级别隔离级别丢失更新脏读不可重复读幻读读未提交Read uncommitted×√√√不可重复读Read committed××√√可重复读Repeatable read默认×××√串行化Serializable××××解决不可重复读的问题只需锁住满足条件的行解决幻读需要锁表事务隔离级别为串行化时读写数据都会锁住整张表。隔离级别对应所能解决的隔离并发问题。隔离级别越高越能保证数据的完整性和一致性但是对并发性能的影响也越大。mysql默认的事务隔离级别为repeatable-read三范式范式的英文Normal Form简写NF第一范式每一项数据都是不可拆分的数据项。第二范式每一个非主属性完全依赖于任何一个候选码。第三范式每一个非主属性既不传递依赖也不部分依赖于码。数据库锁从对数据操作的粒度分 表锁操作时会锁定整个表。行锁操作时会锁定当前操作行。从对数据操作的类型分读锁共享锁S锁针对同一份数据多个读操作可以同时进行而不会互相影响。写锁排它锁X锁当前操作没有完成之前它会阻断其他写锁和读锁。MyISAM 表锁读锁自己可读不可写error 其他线程可读不可写阻塞写锁自己可读可写 其他线程不可读阻塞不可写阻塞InnoDB 行锁InnoDB 实现了两种类型的行锁共享锁S、排他锁X对于UPDATE、DELETE和INSERT语句InnoDB会自动给涉及数据集加排他锁X)对于普通SELECT语句InnoDB不会加任何锁如果不通过索引条件检索数据那么InnoDB将对表中的所有记录加锁实际效果跟表锁一样。使用范围条件而不是使用相等条件检索数据并请求共享或排他锁时InnoDB会给符合条件的已有数据进行加锁对于键值在条件范围内但并不存在的记录叫做 间隙GAP InnoDB也会对这个 “间隙” 加锁这种锁机制就是所谓的 间隙锁Next-Key锁 。间隙锁示例数据示例注意没有id为2的数据。操作示例根据范围id4更新name数据解析id2在id4的条件范围内但id2的记录并不存在。所以id2这条记录是间隙。条件id4即对id123 都加锁了产生间隙锁。因此 Session-2插入id为2的记录时处于阻塞状态。相关学习资料全面深入讲解MySQL数据库优化