关键词:隔离级别、MVCC、索引、性能分析工具、索引优化、SQL优化
隔离级别
1、事务的特性(ACID):
-
原子性:确保事务中的所有操作要么全部成功,要么全部失败。原子性由undo log日志来保证(回滚执行undo log)
如生成订单 insert id = 1 undo log记录 delete id = 1
减库存 update 5>>2 undo log记录 update 2>>5
-
一致性:确保事务在执行前后,数据库都保持在一个一致的状态。这意味着事务开始前和结束后的数据库状态是一致的。如:转账
-
隔离性:确保事务在并发执行时,一个事务的操作不会被其他事务所干扰。
read uncommit 读未提交 脏读
read commit 读已提交 不可重复读 原理:每次读最新的
repeatable read 可重复读 幻读/脏写? 原理:MVCC机制
serializable 串行化
-
持久性:确保一旦事务提交后,其对数据库的修改就是永久性的。
2、隔离级别:
-
读未提交(RU)
-
读已提交(RC):Oracle
-
可重复读:(RR):MySql——在可重复读级别下,事务可以多次读取同一数据,而不会受到其他事务的影响。这是通过使用锁机制和多版本并发控制(MVCC)来实现的。
-
串行化(S)
//讲解脏写、脏读、不可重复读和幻读
https://juejin.cn/post/6954535074637283358
3、不同的隔离级别的哪些问题
-
脏读
读到了其他事件没有提交的数据(如A给B转账,A未提交,B已收到转账)
-
不可重复读
多次读取数据结果不一致(某个字段修改,多次读取数值不同)
-
幻读
多次读取,数据量不一样(主要是插入引起,后查询)
-
慢
/*设置隔离级别的命令 隔离级别:read-uncommitted read-committed repeatable-read serializable*/
set tx_isolation="隔离级别";
/*查看*/
select @@tx_isolation;
/*开始事务*/
begin;
/*执行sql语句*/
sql语句;
/*执行提交/回滚事务*/
commit;
rollback;
MVCC
多版本并发控制
多版本(一行数据的版本链)并发(场景)控制(读取的结果):一条数据允许有同一时刻有不同的事物或者线程对其进行修改,具体控制读取的结果
版本链
undolog和mysql针对每行数据的隐藏字段,trx_id和上个版本的指针
read view(读视图)
-
min_id(最小事务id):active_id_list中的最小id(提高查询效率)
-
max_id(最大事务id):全局的下一个事务id
-
cur_trx_id(当前事务id)
-
active_id_list(当前活跃(没提交的)事务列表)
read view :读已提交,每次读就更新;可重复读,只在第一次查询的时候产生;
示例如下:
read viwe | |
---|---|
Min_id | 26 |
Max_id | 101 |
Cur_trx_id | 100 |
Active_id_list | 26 38 75 |
版本链(每条数据之间有指针连接 id3指向id2 id2指向id1) |
---|
id = 1 name = aa trx_id = 1 |
id = 2 name = bb trx_id = 8 |
id = 3 name = cc trx_id = 35 |
总结:
比最小的小,一定读;(trx_id=9 比min_id=26小 26之前的已经全部提交)
比最大的大,一定不读;(trx_id=103 比cur_trx_id=10