• 一、介绍

    数据库锁机制简单来说,就是数据库为了保证数据的一致性,使各种共享资源在被访问时变得有序而设计的一种原则。

    MySQL的锁机制比较简单,最显著的特点是不同的存储引擎支持不同的锁机制。InnoDB支持行锁,有时也会升级为表锁,MyISAM只支持表锁。

    1. 表锁的特点是开销小,加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率并发度相对低。
    2. 行锁的特点就是开销大,加锁慢;会出现死锁;锁粒度大,发生锁冲突的概率低,并发度也相对行锁较高。

    二、InnoDB的锁类型:

    • 读锁(共享锁)
    • 写锁(排他锁)
    • 意向锁
    • MDL锁

    1.读锁:

    简称S锁,一个事务获取了一个数据行的读锁,其它事务能获得该行对应的读锁,但不能获得写锁,即一个事务在读取一个数据行时,其它事务也可以读,但不能对数据进行增删改的操作。

    读锁有两种select方式的应用,第一种是自动提交模式下的select查询语句,不需加任何锁,直接返回查询结果,这就是一致性非锁定读。第二种就是通过select .....lock in share mode在被读取的行记录或行记录的范围上加一个读锁,让其它事务可以读,但是要想申请加写锁,那就会被阻塞。

    2.写锁:

    简称X锁,一个事务获取了一个数据行的写锁,其它事务就不能再获取该行的其他锁,写锁优先级最高。

    写锁的应用就很简单了,一些DML语句的操作都会对行记录加写锁。

    比较特殊的就是select for update,它会对读取的行记录上加一个写锁,则其它任何事务就不能对被锁定的行上加任何锁了,要不然会被阻塞。

    3.MDL锁。

    MDL锁即meta data lock,用于保证表中元数据的信息。

    在会话A中,表开启了查询事务后,会自动获得一个MDL锁,会话B就不可以执行任何DDL语句的操作。

    不能执行为表中添加字段的操作,会用MDL锁来保证数据之间的一致性。

    会话A:

    root@localhost:mysql3306.sock [(none)]>begin;
    Query OK, 0 rows affected (0.00 sec)

    root@localhost:mysql3306.sock [(none)]>use qq;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed
    root@localhost:mysql3306.sock [qq]>select * from qt;
    +------+------+
    | id | name |
    +------+------+
    | 1 | aa |
    | 2 | bb |
    | 3 | cc |
    | 4 | dd |
    | 5 | ee |
    | 6 | ff |
    | 7 | gg |
    | 8 | hh |
    +------+------+
    8 rows in set (0.00 sec)

    会话B:

    root@localhost:mysql3306.sock [qq]>begin;
    Query OK, 0 rows affected (0.00 sec)

    root@localhost:mysql3306.sock [qq]>alter table qt add num tinyint(1) not null default 0;

    root@localhost:mysql3306.sock [(none)]>show full processlist G;
    *************************** 1. row ***************************
    Id: 12
    User: root
    Host: localhost
    db: qq
    Command: Sleep
    Time: 199
    State:
    Info: NULL
    *************************** 2. row ***************************
    Id: 13
    User: root
    Host: localhost
    db: qq
    Command: Query
    Time: 233
    State: Waiting for table metadata lock
    Info: alter table qt add num tinyint(1) not null default 0
    *************************** 3. row ***************************
    Id: 14
    User: root
    Host: localhost
    db: NULL
    Command: Query
    Time: 0
    State: starting
    Info: show full processlist
    3 rows in set (0.00 sec)

    ERROR:
    No query specified

    4.意向锁

    在MySQL存储引擎InnoDB中,意向锁是表级锁。而且有两种意向锁的类型,分别为意向共享锁和意向排他锁。

    • 意向共享锁(IS)是指在给一个数据行加共享锁前必须取得该表的IS锁。
    • 意向排他锁(IX)是指在给一个数据行加排他锁前必须取得该表的IX锁。

    其实意向锁的作用跟MDL类似,都是防止在事务进行过程中,执行DDL语句的操作而导致的数据不一致。

  • 相关阅读:
    django-restframework使用
    django-xadmin使用
    python2.7.5升级到2.7.14或者直接升级到3.6.4
    mysql-5.7.25安装以及使用
    django1.9安装以及使用
    Algorithm negotiation failed
    ELK的搭建以及使用
    python 3.5 成功安装 scrapy 的步骤
    pandas基础-Python3
    C#命名规则和编码规范
  • 原文地址:https://www.cnblogs.com/chinaops/p/9464327.html
Copyright © 2020-2023  润新知