美文网首页一些收藏
高性能Mysql_笔记1(锁 事务 MVCC 存储引擎)

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

作者: 小名源治 | 来源:发表于2022-09-25 17:54 被阅读0次

    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 存储引擎)

        本文链接:https://www.haomeiwen.com/subject/nhrxartx.html