SQL-MySQL-知识点
1.什么是事务?
事务是一系列符合ACID特性的操作,事务中的操作要么全部成功,要么全部失败。
- 在 MySQL 中只有使用了 InnoDB 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
- 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
2.什么是ACID ?
A:Atomicity 原子性
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
C:Consistency 一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
I:Isolation 隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
D:Durability 持久性
务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3.同时有多个事务在进行会怎么样?
多事务的并发进行一般会造成脏读、不可重复读、幻读的问题
- 脏读:
A事务读取到了B事务未提交的内容,而B事务后面进行了事务回滚(Rollback)。
- 不可重复读:
事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交(commit),导致事务A多次读取同一数据时,结果不一致。
- 幻读:
幻读与不可重复读类似。发生在A事务读取了几行数据,接着另一个并发事务B事务插入了一些数据时。在随后的查询中,A事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
注意:
不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题需要使用行锁,解决幻读需要使用表锁
4.怎么解决脏读、不可重复读、幻读等问题?MySQL的事务隔离级别?
MySQL四种事务隔离级别:
事务隔离级别 | 释义 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交(READ-UNCOMMITTED) | 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 | √ | √ | √ |
不可重复读 / 读已提交(READ-COMMITTED) | 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。 | × | √ | √ |
可重复读(REPEATABLE-READ) | 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。 | × | × | √ |
可串行化(SERIALIZABLE) | 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。 | × | × | × |
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重复读)。
读未提交(READ-UNCOMMITTED):
最低的隔离,A事务可以看到B事务没有提交的部分修改。因此会造成脏读、幻读和不可重复读的问题,该事务隔离级别的性能没有足够大的优势,且问题很多,故很少使用
读已提交(READ-COMMITTED):
A事务只能读取到B事务已经提交的部分数据,该事务隔离级别有不可重复读的问题,在A事务内的多次读取,拿到的结果不一致,因为B事务对数据进行了修改
可重复读(REPEATALE-READ):
可重复读事务隔离级别解决了不可重复读的问题,但是仍然会出现幻读的问题。例如,当A事务读取id >=10 的记录时,对涉及到的所有行加上了读锁,此时B事务新插入了一条id= 11的数据,因为A事务加上的是读锁,而B事务是新增操作,所以不会产生读锁的排斥。当A进行下一次查询的时候会出现多出一条id = 11的数据记录,而上次的查询结果并没有id =11的数据,再进行插入就会有主键冲突的问题。MySQL的InnoDB引擎默认的事务隔离级别就是:可重复读(REPEATABLE-READ)
可串行化(SERIALIZABLE):
最高的事务隔离级别,可以解决脏读、幻读、不可重复读的问题,但是该事务隔离级别下强制将所有的操作都串行执行,会导致并发性能极速下降,因此实际开发中也不常用。
5.MySQL的InnoDB引擎默认使用的是哪种事务隔离级别?
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重复读)。
6.对MySQL的锁了解?
当数据库有并发事务的时候,可能会产生数据的不一致性,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
7.MySQL都有哪些锁?直接进行锁定是否会影响并发效率?
从锁的类别上来说,有共享锁和排他锁。
共享锁:
又叫作读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁:
又叫作写锁,当用户要进行数据的写入时,对数据加上排他锁,排他锁可以加一个,其他的排它锁,共享锁都相斥。
锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁、页级索、表级锁。
加锁开销 | 并发能力 |
---|---|
行级锁 > 页级锁 > 表级索 | 行级锁 > 页级锁 > 表级索 |