mysql复习笔记

mysql中的那些日志
    1、undo log(回滚日志)他保证了事务的原子性。
        是一种撤销回滚的日志,在事务没有提交之前,mysql会记录更新前的数据到undo log里面日志文件里,当事务回滚时,可以利用undo log进行回滚。
        每一条记录更新操作都会产生的undo log格式都有一个roll_pointer和一个trx_id事务ID
        a、通过trx_id可以记录是被哪个事务修改的
        b、通过roll_pointer指针可以将undo log串成一个链表,这个链表被称为版本链
        undo log 不仅可以做回滚日志,还有一个作用就是通过ReadView+undo log实现MVCC(多版本并发控制)
    2、redo log (重做日志) 是innoDb引擎特有的,循环写,固定大小
    3、binglog (归档日志) 是mysql server层实现所有引擎可以用,追加写,写到特定大小切换下一个,不会覆盖以前的日志
为什么会有两份日志?
    因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,
    binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,
    所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。
    
脏读:读到其他事务未提交的数据; 

不可重复读:前后读取的记录内容不一致; 

幻读:前后读取的记录数量不一致;

读未提交是指:一个事务还没提交时,它做的变更就能被别的事务看到。
    在读未提交隔离级别下,可以会出现,脏堵、不可重复读、幻读

读提交是指:一个事务提交之后,它做的变更才会被其他事务看到。
    在读提交隔离级别下,每一句执行前,都会从新算出一个新的视图。可以会出现不可重复读和幻读

可重复读是指:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
    可重复读隔离级别下,只需要在  启动事务开始   的时候创建一致性试图,之后事务里的其他查询都共用这个一致性视图。
    在可重复读隔离级别下可能会出现幻读,但是可以最大程度避免幻读的出现,具有两种情况
    1、针对快照度(普通的select语句),是通过MVCC多版本控制方式解决了幻读,因为在可重复读隔离级别下,一个事务执行过程看到的数据,
        总是跟这个事务启动时看到的数据一致,对于在这个过程新增的数据是不可见的,后续的查询语句利用这个 Read View,
        通过这个 Read View 就可以在 undo log 版本链找到事务开始时的数据,所以事务过程中每次查询的数据都是一样的,
        即使中途有其他事务插入了新纪录,是查询不出来这条数据的,所以就很好了避免幻读问题所以就很好解决了幻读。
    2、针对当前读(select ...for update)是通过next-key lock(记录锁+间隙锁)方式解决了幻读,因为在执行select...for update时会加next-key lock如果这时
        有其他事务在next-key lock范围内插入一条数据,那么这条语句就会阻塞。所以很好的解决了幻读

串行化:顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
    在串行化隔离级别下,不会出现脏读、不可重复读、幻读。

MVCC多版本控制:
    在innoDB中存储引擎数据表中,在聚族索引这一列进行改动时都有两个隐藏列
        a、trx_id 每次修改时都记录这个事务ID 在隐藏列trx_id
        b、roll_pointer 每次修改聚族索引列改动时,都是会把旧版本记录到undo log中,然后这个隐藏列是指针,指向上一每一个旧版本,于是通过这个指针就可以找到修改前的记录
    再创建Read view后 我们可以把trx_id 分为三种情况
        a、已提交的事务min_trx_id 
        b、已启动但未提交的事务m_ids
        c、还没开始的事务max_trx_id
    一个事务去访问记录的时候除了自身可见外,还有一下几种情况
        a、如果记录trx_id值小于Read View中的min_trx_id 那么这条记录表示在Read View创建之前已完成,那么这条记录对当前事务可见
        b、如果记录trx_id值大于Read View中的min_trx_id 那么这条记录表示在Read View创建之后完成,那么这条记录对当前记录不可见
        如果记录trx_id在min_trx_id和max_trx_id之间又分为两张情况:
            1、如果记录trx_id在m_ids列表中,表示处于活跃的事务还没有提交,所以该版本对当前事务不可见
            2、如果记录trx_id不在m_ids列表中,说明该版本活跃的事务已经提交了,所以该版本记录对当前事务可见。

        


你可以在 information_schema 库的 innodb_trx 这个表中查询长事务
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
在 MySQL 有两种开启事务的命令,分别是:

第一种:begin/start transaction 命令;
第二种:start transaction with consistent snapshot 命令;

重建索引: alter table T engine=InnoDB

间隙锁和行锁合称: next-key lock

插入意向锁:是指间隙锁中 比如锁住(20,25)行中,插入一条数据 就会处于等待,这个锁在select * from performance_schema.data_locks\G 查看是
    LOCK_MODE:INSERT_INTENTION 插入意向锁,插入意向锁也属于间隙锁
    
记录锁:
    1、查询条件为主键索引,如果查询的条件为等值且值存在,加记录锁,此时其他事务修改删除此数据会等待;
    2、查询条件为主键索引,如果查询条件为等值但值不存在 会对查询条件的下一条记录加间隙锁;
    3、查询条件为唯一索引,如果查询条件为等值查询且记录存在,在唯一索引加记录锁,给主键加记录锁;
    4、查询条件为唯一索引,如果查询条件为等值查询且记录不存在,只会在查询条件的间隙的下一条记录加间隙锁,不会给主键加锁;
    5、查询条件是非唯一索引时,如果查询条件是等值查询且记录存在,在非唯一索引上,会对符合查询条件的记录加邻键锁,对剩余未加锁的间隙的下一条记录加间隙锁;
        在主键索引上,对符合查询条件的记录在主键索引对应的位置上加记录锁
    6、查询条件是非唯一索引时,如果查询条件是范围查询且记录不存在,在非唯一索引上,
       会对查询条件所在间隙的下一条记录加邻键锁(实际上加间隙锁就可以了);在主键索引上不加锁
    7、如果查询的非索引-----也就是统称锁表

MyISAM 没有 crash-safe 的能力
MyISAM 不支持事务
MyISAM 引擎就不支持行锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值