MySQL基础篇(一)
1. 事物的四大特性
事务是逻辑上的一组操作,要么都执行,要么都不执行
- 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
- 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
2. MySQL事物的四个隔离级别
2.1 隔离级别
- 读取未提交 :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- 读取已提交 :允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- 可重复读 :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- 可串行化 :最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
2.2 各隔离级别可能会导致的问题
隔离级别脏读不可重复读幻读读取未提交可能出现可能出现可能出现读取已提交解决可能出现可能出现可重复读 解决解决可能出现可串行化 解决解决解决
3. 事物的脏读、幻读、不可重复读
3.1 脏读
A事物读取表中数据为500
B事物将表中数据修改为350,未提交
A事物再次读取数据为350
B事物回滚
此时数据库中数据仍为500,认为A事物第二次读到的数据为脏数据
3.2 幻读
幻读是指一个事务在多次查询中返回了不一致的结果。例如,假设有两个事务C和D,C首先按照某个范围条件(如id>10 and id<20)查询了表中的数据,然后D在这个范围内插入了新的数据。当C再次查询这个范围时,它可能会发现多了一些新插入的数据。这就是幻读。
3.3 不可重复读
不可重复读是指在一个事务内,多次读取同一数据返回的结果不一致。这通常发生在一个事务内先进行了一次查询操作,然后又对该数据进行了更新操作,而另一个事务在此期间也对该数据进行了更新操作。当第一个事务再次读取该数据时,它读取到的是更新后的值,而不是初始值。这就是不可重复读
4. 共享锁和排他锁
- 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
- 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。
排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。
5. 执行一条sql语句的全过程
5.1 查询语句执行流程
1.建立数据库连接
2.校验权限(没有权限直接返回错误信息)
3.MySQL8.0版本前会先查询缓存,以当前sql语句为key查询缓存,如果命中则直接返回结果,否则进入下一步
4.分析器进行语法分析和词法分析
5.优化器选择合适索引,确定执行方案
6.执行器从存储引擎读取记录返回给客户端
MySQL8.0删除了查询缓存,因为缓存命中率低
5.2 更新语句执行流程
1.建立连接
2.更新语句会把这张表上的所有缓存结果清空
3.分析器进行词法分析和语法分析
4.优化器选择合适索引
5.执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接在主键索引树搜索找到这一行。如果ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
6.执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
7.引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
8.执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
9.执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。
6. MySQL索引
索引==>目录