SQL学习大纲

关键词:隔离级别、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

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值