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,多版本并发控制)一种用于实现数据库并发控制的方法,尤其在InnoDB存储引擎中得到了广泛应用。它的主要作用是提高数据库在高并发场景下的性能,并确保数据的一致性。
原理
MVCC通过保存数据的多个版本来管理并发事务。这些版本是通过在每次事务操作(插入、更新、删除)时创建的新数据快照实现的。这样,不同事务在读取同一数据时,可以看到不同的数据版本,从而避免了读写锁的竞争。
关键技术点
-
隐藏列:
- 每个记录除了用户定义的字段外,还包含两个额外的隐藏列:
trx_id
和roll_pointer
。其中,trx_id
记录插入或最后一次更新该记录的事务ID,而roll_pointer
指向该记录的上一个版本。
- 每个记录除了用户定义的字段外,还包含两个额外的隐藏列:
-
快照读:
- 快照读(Snapshot Read)是指通过MVCC机制读取数据的方式。事务开始时,会记录当前的系统版本号(也称为Read View)。在读取数据时,只会读取版本号小于或等于Read View版本号的数据,确保读到的数据是一致的。
-
当前读:
- 当前读(Current Read)是指读取最新的数据并加锁。例如,
SELECT ... FOR UPDATE
或UPDATE
操作。当前读需要获取最新的数据版本,并对读取的数据加锁,以防止其他事务的并发修改。
- 当前读(Current Read)是指读取最新的数据并加锁。例如,
-
版本链:
- 每条记录通过
roll_pointer
形成一个版本链。最新的记录指向上一个版本,依次类推。这样在执行回滚操作时,可以通过版本链找到对应的历史版本,实现数据的恢复。
- 每条记录通过
优点
-
提高并发性能:
- 由于MVCC避免了读写锁的直接竞争,提高了数据库在高并发场景下的性能。
-
事务隔离级别支持:
- MVCC主要支持读已提交(Read Committed)和可重复读(Repeatable Read)两种隔离级别,确保数据一致性的同时,提高了系统的吞吐量。
-
一致性视图:
- 每个事务在执行过程中看到的数据都是一致的,不会因为其他事务的修改而产生不一致的读。
缺点
-
空间开销:
- 多版本数据的维护需要额外的存储空间,尤其是对于频繁更新的表,历史版本的累积可能会导致空间占用增加。
-
复杂性增加:
- MVCC的实现增加了数据库系统的复杂性,需要更复杂的机制来管理多版本数据和垃圾回收。
通过以上机制,MVCC在保证数据一致性的前提下,提高了数据库的并发处理能力,是MySQL中非常重要的并发控制手段。
4 介绍下 redo log, undo log, bin log
1. redo log 是 innodb 引擎产⽣的,主要⽤于⽀持MySQL事务,MySQL会先写 ⽽后在写 binlog 。 redo log 可以保证即使数据库异常重启,数据也不会丢失;
2. undo log 是 innodb 引擎产⽣的,主要时候⽤于解决事务回滚和MVCC。数据修改的时 候,不仅记录 redo log ,也会记录 undo log 。在事务执⾏失败的时候,会使⽤ 进⾏回滚;
3. bin log 主要⽤于复制和数据恢复,记录了所有对数据库进行更改的SQL语句(包括增、删、改操作)。
5 mysql中都有哪些锁?介绍一下
锁机制,对于 innodb 来说,有多个维度:
1. 从独占性来说,有排他锁和共享锁;
2. 从锁粒度来说,有⾏锁和表锁;
3. 从意向来说,有排他意向锁和共享意向锁;
4. 从场景来说,还可以分为记录锁,间隙锁和临键锁;