MySQL优化2

MySQL2

1、事务的属性与隔离级别

属性
  1. 原子性:事务要么完成,要么不起作用,不允许分割
  2. 一致性:数据库从一种一致性状态转移到另一种一致性状态
  3. 隔离性:并发事务之间数据库是独立的
  4. 持久性:事务提交回滚之后对数据库的改变是持久的
事务隔离级别
  1. READ_COMMITTED(读已提交) 允许读取并发事务已经提交的数据 可能导致幻读、不可重复读

  2. READ_UNCOMMITTED(读未提交) 最低 允许读未提交的数据 可能导致脏读、幻读、不可重复读

  3. REPETABLE_READ(可重复读) 解决不可重复读的问题 实际业务需求

    ​ 不可重复读现象:因为其他并发事务的提交导致相同查询不同的结果

  4. SERIALIZABLE(串行化) 最高的隔离级别 防止脏读、幻读、不可重复读

2、MVCC(Multi-Version Concurrency Control 多版本并发控制)

在REPETEAED_READ READ_COMMITTED 隔离级别下的事务执行普通的select操作访问记录的版本链的过程,可以使不同事务的读__写、写__读操作并发执行。

版本链表 除了原有的列之外事务id与回滚指针

ReadView是一个集合存放begin之后未commit与rollback的事务,查询的时候拿着事务id去比较看id在不在ReadView中如果不在就读 如果在就利用地址指针到下一个版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIkHbeqr-1584771834281)(D:\自己总结的资料\T&X\typora\PIC\ReadView.png)]

两种级别的ReadView生成时机不同 READ_COMMITTED每次select都会生成一个ReadView REPETEAED_READ只在第一次select的时候生成

3、锁机制

  1. 默认一条SQL会自动开启事务提交事务

  2. DDL会自动提交事务(create drop alter) {DQL查询select,DCL 权限相关}

  3. 锁会在事务提交后释放

  4. 共享锁相互兼容

  5. 排他锁与任何锁不兼容

  6. select操作默认不加锁

  7. 可以使用lock in share mode给select加共享锁 使用for update加排它锁

  8. update insert delete默认添加排他锁

  9. 事务隔离级别为串行化时默认添加共享锁

  10. 悲观锁:每个查询都添加共享锁不希望别人修改自己正在读的信息

    乐观锁:查询的时候不加锁之后进行比对

  11. 行锁只对一行添加锁

  12. 表锁与意向锁 添加表锁会对表中的每一行进行比对如果发现行锁 则不添加 为了提高比较效率可以对存在行锁的表添加意向锁

  13. 间隙锁:

  14. RC级别中加行锁不会影响不存在的数据 只锁当前查到的

  15. RR级别中如果是对索引加的锁会出现间隙锁影响未添加的数据 不是对索引加的锁则会锁住全表

你可能感兴趣的:(MySQL优化2)