• mysql性能优化(三)- 事务控制


    1、Innodb引擎对隔离级别的支持程度

    事务隔离级别 脏读 不可重复读 幻读
    未提交读(Read Uncommited) 可能 可能 可能
    已提交读(Read Commited) 不可能 可能 可能
    可重复读(Repeated Read) 不可能 不可能 对Innodb不可能
    串行化(Serializable) 不可能 不可能 不可能

    隔离级别到底如何实现的呢?锁、MVCC

    2、理解表锁、行锁

    锁是用于管理不同事务对共享资源的并发访问

    表锁与行锁的区别:

    锁定粒度:表锁 > 行锁

    加锁效率:表锁 > 行锁

    冲突概率:表锁 > 行锁

    并发性能:表锁 < 行锁

    InnoDB存储引擎支持行锁和表锁(另类的行锁)

    3、MySql InnoDB锁类型

    共享锁(行锁):Shared Locks

    排它锁(行锁):Exclusive Locks

    意向锁共享锁(表锁):Intention Shared Locks

    意向锁排它锁(表锁):Intention Exclusive Locks

    自增锁:AUTO-INC Locks

    a、行锁的算法

    记录锁 Record Locks

    间隙锁 Gap Locks

    临键锁 Next-key Locks

    b、共享锁(Shared Locks)VS 排它锁(Exclusive Locks)

    共享锁:又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁, 都能访问到数据,但是只能读不能修改;

    加锁释锁方式:select * from users WHERE id=1 LOCK IN SHARE MODE;  commit/rollback;

    排他锁:又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他 锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对 数据行进行读取和修改,(其他事务要读取数据可来自于快照)

    加锁释锁方式:

    delete / update / insert 默认加上X锁

    SELECT * FROM table_name WHERE ... FOR UPDATE commit/rollback

    c、innodb-行锁到底做了什么?

    InnoDB的行锁是通过给索引上的索引项加锁来实现的。

    只有通过索引条件进行数据检索,InnoDB才使用行级锁,否则,InnoDB 将使用表锁(锁住索引的所有记录)

    表锁:lock tables xx read/write;

    d、意向锁共享锁(IS)&意向锁排它锁(IX)

    意向共享锁(IS)

    表示事务准备给数据行加入共享锁,即一个数据行加共享锁前必须先取得该表的IS锁, 意向共享锁之间是可以相互兼容的

    意向排它锁(IX)

    表示事务准备给数据行加入排他锁,即一个数据行加排他锁前必须先取得该表的IX锁, 意向排它锁之间是可以相互兼容的

    意向锁(IS、IX)是InnoDB数据操作之前自动加的,不需要用户干预

    意义:

    当事务想去进行锁表时,可以先判断意向锁是否存在,存在时则可快速返回该表不能 启用表锁

    e、自增锁AUTO-INC Locks

    针对自增列自增长的一个特殊的表级别锁

     

    show variables like 'innodb_autoinc_lock_mode';

    默认取值1,代表连续,事务未提交ID永久丢失

    f、记录锁(Record)&间隙锁(Gap)&临键锁(Next-key)

    Record locks:

    锁住具体的索引项

    当sql执行按照唯一性(Primary key、Unique key)索引进行数据的检索时,查询条件等值匹 配且查询的数据是存在,这时SQL语句加上的锁即为记录锁Record locks,锁住具体的索引项

    Gap locks:

    锁住数据不存在的区间(左开右开)

    当sql执行按照索引进行数据的检索时,查询条件的数据不存在,这时SQL语句加上的锁即为 Gap locks,锁住索引不存在的区间(左开右开)

    Next-key locks:

    锁住记录+区间(左开右闭)

    当sql执行按照索引进行数据的检索时,查询条件为范围查找(between and、<、>等)并有数 据命中则此时SQL语句加上的锁为Next-key locks,锁住索引的记录+区间(左开右闭)

    g、临键锁(Next-key)

     为什么innodb选择临键锁Next-key作为行锁的默认算法?

     

     h、间隙锁(Gap)

     

    Gap只在RR事务隔离级别存在

    i、记录锁(Record)

     

    4、利用锁怎么解决脏读

     

     

     使用排它锁

    5、利用锁怎么解决不可重复读

     使用共享锁

    6、利用锁怎么解决幻读

     

    使用临键锁

    7、死锁介绍

     多个并发事务(2个或者以上);

       每个事务都持有锁(或者是已经在等待锁);

       每个事务都需要再继续持有锁;

     事务之间产生加锁的循环等待,形成死锁。

    死锁的避免

    1)类似的业务逻辑以固定的顺序访问表和行。

    2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。

    3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概 率。

    4)降低隔离级别,如果业务允许,将隔离级别调低也是较好的选择

    5)为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添 加上锁(或者说是表锁)

    8、MVCC

    MVCC:

    Multiversion concurrency control (多版本并发控制)

    并发访问(读或写)数据库时,对正在事务内处理的数据做 多版本的管理。以达到用来避免写操作的堵塞,从而引发读操 作的并发问题。

  • 相关阅读:
    《Effective C#中文版:改善C#程序的50种方法》读书笔记
    WPF总结
    定义集合属性(WPF)
    c#只读字段和常量的区别,以及静态构造函数的使用 .
    编程方法的参数
    关于事件的点滴总结
    线程间的消息(或数据)传递
    OOP的感悟
    VS2010快捷键大全----养成良好的习惯
    UTF-8里包括GB2312
  • 原文地址:https://www.cnblogs.com/nangonghui/p/11454703.html
Copyright © 2020-2023  润新知