1 什么是事务?
事务是指 多个数据库操作组成一个逻辑执行单元,满足ACID四个条件。
A是指原子性,事务保证操作要么全部完成,要么全部不完成,不会出现部分完成的情况;
C是指一致性,事务执行后,数据库从一个状态转移到另一个状态,数据完整性约束不变;
I是指隔离性,一个事务的执行不影响另外一个事务的执行;
D是指持久性,事务一旦提交,其对数据库的改变就应该是永久性的,即使发生系统故障或者断电等情况,修改也不会丢失。
一致性举例:
当一个银行客户从一个账户转账到另一个账户时,这涉及一个事务。事务的一致性保证了在转账过程中,无论是从账户A扣除的金额还是账户B增加的金额,最终的总金额应该保持不变,即转账前后账户总金额应该保持一致。如果在转账过程中出现错误或者中断,系统应该能够回滚事务,使得账户状态恢复到转账之前的一致状态,以避免任何账户金额不一致的情况发生。
持久性举例:
假设一个在线购物网站的订单处理系统。当用户下单并完成支付时,订单的相关信息(如订单详情、付款状态等)需要被保存到数据库中,以确保订单信息不会丢失或被意外删除。即使系统在订单提交后发生了断电或者其他故障,系统重新启动后,数据库应该能够恢复到之前提交订单时的状态,确保订单的支付状态和详情依然可用,而不会出现丢失订单或者支付状态不一致的情况。这种持久性保证了系统的可靠性和数据的完整性。
MySQL的 innodb引擎支持事务,myisam引擎不支持事务。
innodb引擎是通过MVCC来支持事务的。
2 说一说事务的隔离级别?
关键点:结构化回答,mysql的事务隔离级别是什么?为什么会有这个隔离级别呢,是要解决什么问题?
MySQL 的事务隔离级别有四个,分别是:
-
READ UNCOMMITTED(未提交读):允许事务读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读问题。
-
READ COMMITTED(提交读):保证一个事务提交后才能被其他事务读取,可以防止脏读,但是仍可能出现不可重复读和幻读问题。
-
REPEATABLE READ(可重复读):确保在事务执行期间多次读取相同记录的结果是一致的,可以防止脏读和不可重复读,但仍可能有幻读问题。
-
SERIALIZABLE(可串行化):通过强制事务串行执行来避免脏读、不可重复读和幻读,是最高的隔离级别,但性能较差。
这些隔离级别的存在是为了解决多个事务并发访问数据库时可能引发的数据一致性问题。不同的隔离级别提供了不同的数据访问保障,用户可以根据自己的应用需求和对数据一致性的要求选择合适的隔离级别。
常见的问题包括:
- 脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。
- 不可重复读(Non-repeatable Read):在一个事务内,两次读取同一行数据得到的结果不一致。
- 幻读(Phantom Read):在一个事务内,两次查询同一个范围的数据集合得到的行数不一致。
不同的隔离级别通过不同的锁定策略或数据版本控制机制来解决这些问题,从而在保证数据并发访问性能的同时,尽可能地确保数据的一致性。
3 什么是MVCC?
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统的并发控制方法。它允许多个事务同时读取和写入数据,从而提高了数据库的并发性能。MVCC的核心思想是通过维护数据的多个版本,避免事务之间的冲突,提供快照隔离级别(Snapshot Isolation),实现高效的并发控制。
MVCC的原理
-
版本号:
- 每条记录在数据库中都有一个版本号,通常包括创建版本号和删除版本号。
- 创建版本号标识记录被哪个事务创建。
- 删除版本号标识记录被哪个事务删除。如果记录未被删除,则删除版本号为未定义。
-
快照:
- 每个事务在开始时,都会获得数据库的一个快照,即一个一致的视图。
- 事务在读取数据时,总是从这个快照中读取数据,而不是读取当前的实际数据,这样可以避免读取到其他事务正在修改的数据。
-
读取数据:
- 读取操作会根据事务的开始时间和记录的版本号来确定可见性。
- 事务只会看到在它开始之前已经提交的记录版本,不会看到其他未提交的修改。
-
写入数据:
- 写操作会创建数据的新版本,而不会覆盖原有版本。
- 当一个事务对数据进行修改时,会生成一条新的记录版本,并标记该版本的创建时间为当前事务的ID。
- 旧版本的数据会被保留,以供并发的其他事务读取。
-
回滚和提交:
- 如果事务提交,新的版本号会被记录为已提交状态。
- 如果事务回滚,所有新版本的记录都会被丢弃。
MVCC的优点
- 提高并发性:多个事务可以同时执行读写操作,不会因为锁定而阻塞。
- 避免读写冲突:读操作不会被写操作阻塞,因为读操作可以读取快照数据。
- 实现快照隔离:事务读取的数据是一致的快照,可以避免脏读、不可重复读等问题。
MVCC的缺点
- 存储开销:由于需要维护多个版本的数据,会占用更多的存储空间。
- 版本管理复杂:需要有效地管理和清理过期版本,以避免存储空间浪费。
4 介绍下 redo log, undo log, bin log
-
r edo log 是 innodb 引擎产⽣的,主要⽤于⽀持MySQL事务,MySQL会先写 ⽽后在写 binlog 。 redo log 可以保证即使数据库异常重启,数据也不会丢失
-
u ndo log 是 redo log , innodb 引擎产⽣的,主要时候⽤于解决事务回滚和MVCC。数据修改的时 候,不仅记录 redo log ,也会记录 undo log 。在事务执⾏失败的时候,会使⽤ 进⾏回滚;
-
b inlog 主要⽤于复制和数据恢复,记录了写⼊性的操作。 和混合模式三种复制模式。
(扩展点1,阐述两阶段提交)
因为r edo log ⽣成到 undo log binlog 分成基于语句,基于⾏ binlog 写⼊之间有⼀个时间差,所以为了保证两者的⼀致性,MySQL引 ⼊了两阶段提交:
-
Prepare阶段,写⼊ redo log ;
-
Commit阶段,写⼊ binlog ,提交事务;
(扩展点2,阐述⼀下的刷盘时机)
-
b inlog 刷盘可以通过 sync_binlog 参数来控制。0-系统⾃由判断,1-commit刷盘,N-每 N个事务刷盘
-
r edo log 刷盘可以通过参数 innodb_flush_log_at_trx_commit 控制。0-写⼊ 每秒刷新到盘;1-每次提交;2-写⼊到 Reference
5 mysql中都有哪些锁?介绍一下
锁机制,对于 innodb 来说,有多个维度:
-
从独占性来说,有排他锁和共享锁;
-
从锁粒度来说,有⾏锁和表锁;
-
从意向来说,有排他意向锁和共享意向锁;
-
从场景来说,还可以分为记录锁,间隙锁和临键锁;