zoukankan      html  css  js  c++  java
  • 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 (多版本并发控制)

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

  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/nangonghui/p/11454703.html
Copyright © 2011-2022 走看看