数据库学习1

锁模块

MyISAM 与InnoDB关于锁方面得区别是什么?

  • MyISAM默认用的是表级锁,不支持行级锁;
    • 范围查询的时候默认给表上read🔒(共享锁)

      1
      lock tables students read | write;

      write🔒(排他锁)

      上锁之后读和写都要等

  • InnoDB默认用的是行级锁,也支持表级锁;
    • 手动上锁,只对该行上锁;

      1
      select * from students_innodb where id=3 lock in share mode;

      共享锁可以兼容;

      当查找不走索引的时候上的是表级锁;

      image-20210827142925274

那是不是锁越细越多越好?

🔒越多花费的资源越多;在数据较少的情况下用非聚集索引MyISAM很快

MyISAM适合的场景

  1. 频繁执行全表count语句;
  2. 对数据进行增删改的频率不高,查询非常频繁;
  3. 没有事务;

InnoDB适合的场景

  1. 增删改查都比较频繁;
  2. 可靠性要求较高,要求支持事务;

数据库🔒的分类:

  • 按照粒度划分:表级锁,行级锁,页级🔒;
  • 按照级别划分:共享锁、排它锁;
  • 按照枷锁方式:自动锁、显式锁;
  • 按操作划分:DML锁、DDL锁;
  • 按使用方式划分:乐观锁,悲观锁;

悲观锁:一般用数据库自己带的锁;

乐观锁:使用数据版本控制,只有在增删改查的时候才会去判断冲突;

数据库事务的四大特征:ACID

  • A原子性(Atomic)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

事务隔离级别以及各级别下的并发访问问题

MySQL默认是repeatable-read Orcal默认是read-committed

  • 更新 丢失———mysql所有事务隔离级别在数据库层面上均可避免;
    • eg:存钱失败
  • 脏读——设置read-committed事务隔离级别以上可避免;
    • 指的是一个session读取了另一个未提交的事务,另一个事务回滚之后造成翻车;
    • 解决:set session transaction level read committed;
  • 不可重复读——repeatable-read事务隔离级别以上可避免;
    • 多次查询结果变化了超出预期;
  • 幻读——serializable事务隔离级别可避免;
  • Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
image-20210827153216400

当前读和快照读

image-20210827154029335

image-20210827160905898

RR级别下如何避免幻读

image-20210827161106338

image-20210827161358934

image-20210827161434810

Other

讲的很透彻的一篇好文:理解事务的 4 种隔离级别

-------------本文结束感谢您的阅读-------------