高性能Mysql_笔记1(锁 事务 MVCC 存储引擎)

1.1并发控制

1.1.1读写锁

读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源,而互不干扰。

写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。

加了读锁之后还能加读锁,但是不能加写锁。加了写锁之后什么锁都不能再加了

1.1.2粒度锁(表锁,行锁)

锁粒度的意思是:锁的范围的大小

  • 表锁:表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁它会锁定整张表。一个用户在对表进行写操作(插入、删除、更新等)前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。
  • 行级锁:行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销)。众所周知,在InnoDB和XtraDB,以及其他一些存储引擎中实现了行级锁。行级锁只在存储引擎层实现,而MySQL服务器层没有实现。

1.2事务

1.2.1事务

  • 什么是事务:事务是数据库执行操作中的最小单元,不可再拆分,要么全部执行成功,要么全部执行失败
  • 事务的四大特性:原子性 一致性 隔离性 持久性

1.2.2隔离级别

四种隔离级别:

  • read uncommitted 读未提交 -- RU

    • 特点:事务可以读取到其他事务未提交/未回滚前的数据,会产生脏读
    • 什么是脏读:由于事务读取到了其他事务未提交/未回滚前的数据,导致读取的数据最终是不存在的,这个现象就叫做脏读.
  • read committed 读已提交 -- RC

    • 特点:事务只能读取到其他事务提交/回滚后的数据,解决了脏读问题,但是会产生不可重复读问题.
    • 什么是不可重复读:在事务A执行期间,其他事务对事务A访问的数据进行修改操作,导致事务A中前后两次读取相同的数据的结果是不一致的.这个现象就叫做不可重复读
  • repeatable read 可重复读 --RR

    • 解决了不可重复读问题,产生了新的问题 -- 幻读
    • 什么是幻读: 在事务A访问数据期间,其他事务执行了插入操作,导致事务A前后两次读取到的数据总量不一致,这个现象就叫做幻读.
  • serializable 可串行化

    • 解决了幻读问题,实现了多事务并发执行同步效果,所以这个隔离级别的并发执行效率是最低下的

事务的自动提交

  • 查看事务的自动提交是否开启:
show variables like 'autocommit' 

on off 
  • 如何关闭事务自动提交:
set autocommit=off; 
  • 事务管理:
    • 开启事务: begin
    • 提交事务: commit
    • 回滚事务: rollback

对数据库的增删改操作默认开启事务,而select不涉及事务

当业务方法涉及到多步增删改操作时,且想要他们保证要成功全成功,但凡有一个操作失败,则整个操作应该全部失败,此时就应该为这个业务方法开启事务管理。

1.2.3死锁

什么是死锁:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。

解决办法:InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚(这是相对比较简单的死锁回滚算法)。

死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。

1.3多版本并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgresQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准。

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

1.4MySQL的存储引擎(InnoDB)

  • InnoDB是 MySQL 的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务,短期事务大部分情况是正常提交的,很少会被回滚。InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。

  • InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

你可能感兴趣的:(高性能Mysql_笔记1(锁 事务 MVCC 存储引擎))