MySQL - mysql 面试题
事务的四个特点是什么?他们的实现原理是什么?
事务的四个特点是ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
A(Atomicity):原子性 通过undolog实现
事务是一个不可分割的工作单位,要么全部执行成功,要么全部失败回滚,不能只执行部分操作。实现原理是使用日志记录所有对数据库的修改操作,并在执行过程中进行回滚操作。
C(Consistency):一致性
事务的执行结果必须使数据库从一个一致性状态转换到另一个一致性状态。实现原理是在事务开始前对数据库进行约束检查,保证事务执行后数据库仍然满足约束条件。
I(Isolation):隔离性 通过锁 MVCC实现
多个事务并发执行时,每个事务的执行都应该与其他事务的执行相互隔离,互不干扰。实现原理是使用锁机制对共享资源进行控制,以保证每个事务可以独立地访问和修改数据。
D(Durability):持久性 通过redolog实现
事务执行结束后,其对数据库的修改应该永久保存在数据库中,即使出现系统故障也不会丢失。实现原理是使用日志记录所有对数据库的修改操作,并在系统重启后通过恢复操作将这些修改重新应用到数据库中。
mysql的redolog、undolog、binlog分别有什么作用?
MySQL的redo log、undo log和binlog是三种不同的日志,各自有不同的作用:
1. Redo log(重做日志):记录了所有对数据页的修改操作,包括插入、更新、删除等。其主要作用是确保事务提交后,即使发生系统崩溃或宕机等异常情况,也能够通过重做日志来恢复数据。Redo log是物理日志,记录的是对数据页的修改操作,因此在恢复时需要重新执行对应的物理操作。
2. Undo log(回滚日志):记录了事务执行前的数据状态,主要用于实现事务的回滚操作。当事务需要回滚时,可以使用Undo log中的信息将数据恢复到事务开始前的状态。Undo log是逻辑日志,记录的是对数据的逻辑操作,因此在恢复时需要执行相反的逻辑操作。
3. Binlog(归档日志):记录了所有对数据库的修改操作,包括数据库结构的变化和数据的增删改操作等。Binlog主要用于数据备份、数据复制和恢复操作。可以通过Binlog将数据库的修改操作传输到其他服务器,以实现数据同步或灾备等功能。Binlog是逻辑日志,记录的是对数据库的逻辑操作,因此在恢复时需要执行相应的逻辑操作。
综上所述,Redo log、Undo log和Binlog分别用于保证数据的一致性、实现事务的回滚操作和实现数据备份、数据复制等功能。在MySQL中,这三种日志通常一起使用,以确保数据的安全性和可靠性。
什么是二阶段提交,如何保证宕机时数据的一致性?
二阶段提交(Two-Phase Commit):是一种分布式事务协议,用于在多个数据库节点之间保持数据的一致性。在二阶段提交协议中,事务的提交过程分为两个阶段:准备阶段和提交阶段。在准备阶段,各个节点会向协调者发送准备请求,并等待协调者的回复;在提交阶段,协调者会向各个节点发送提交请求,并等待节点的响应。只有当所有节点都已经准备就绪后,协调者才会发送提交请求,否则会发送回滚请求,撤销事务的执行。
在宕机时,二阶段提交协议可以通过超时机制来保证数据的一致性。如果某个节点在规定时间内没有响应,协调者会将其视为故障节点,向其他节点发送回滚请求,以确保数据的一致性。
MVCC如何实现多版本并发控制?如何解决读写冲突?
MVCC(Multi-Version Concurrency Control):是一种多版本并发控制技术,用于在并发访问中保证数据的一致性。MVCC通过为每个事务创建一个独立的数据版本,避免了读写之间的冲突,从而提高了并发访问的效率。
MVCC的实现原理是,在每个数据行中增加一个版本号,每次修改时都会生成一个新的版本,而不是直接覆盖原有的数据。在读取数据时,系统会根据事务的隔离级别选择合适的数据版本进行访问,以保证数据的一致性。
解决读写冲突:在MVCC中,读操作和写操作之间是不存在冲突的,因为每个事务都是读取自己创建的版本,不会对其他事务产生影响。但是,在并发读操作时可能会出现读写冲突,这时可以使用锁机制来解决冲突。
mysql中的幻读是什么?如何解决幻读问题?
幻读(Phantom Read):是指在一个事务中多次执行同一语句,但由于其他事务插入了新数据,导致查询结果不一致的现象。
解决幻读问题可以采用两种方法:一种是使用锁机制来避免并发插入操作,但这样会降低并发性能;另一种是使用快照隔离级别,在读取数据时不加锁,而是复制一份当前数据的快照,从而避免了幻读问题。
在MySQL中,MVCC是通过在InnoDB存储引擎中实现的。InnoDB使用多版本并发控制来保证数据的一致性,在读取数据时会根据事务的隔离级别选择合适的数据版本进行访问。同时,InnoDB还使用了间隙锁来避免幻读问题的出现。
MySQL系统有哪些日志
slowlog、binlog、relaylog、errorlog、undolog、redolog
- server
- slowlog:慢日志,可以记录执行比较慢的sql语句,可以设置时间,超过这个时间就是慢sql,记录到slowlog中
- binlog:用来进行主从复制或者数据备份
- relaylog:中继日志,用来记录同步来的binlog数据
- errorlog:错误日志,记录mysql运行过程中的错误信息
- innodb
- undolog:回滚日志,方便进行回滚操作以及满足mvcc的需要
- redolog:前滚日志,用来进行持久化存储
数据库的并发场景
读读:不存在任何并发问题,也不需要并发控制
读写:有线程安全问题,会造成脏读、幻读、不可重复读
写写:有线程安全问题,会造成丢失更新。
mysql 中执行了grant select on a.* to user_a;
然后数据库a中的表删除后,又重新生成,那么还需要再赋权么?
不用,上述赋权语句是数据库级别的,不是针对某个表,所以重新生成后,不需要再次赋权。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南