zoukankan      html  css  js  c++  java
  • 一、介绍

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

    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语句的操作而导致的数据不一致。

  • 相关阅读:
    linux shell习题
    The logback manual #02# Architecture
    The logback manual #01# Introduction
    算法导论(第三版)练习 10.1-1 ~ 10.1-7
    算法笔记 #006# 快速排序 × 算法导论(第三版)练习 7.1-1 ~ 7.1-4
    Linux笔记 #08# shell编程从零开始到低配学生管理系统
    Maven笔记 #01# 入门
    Java日志学习资料收集
    jsp中用EL读取了数据库里面的时间,怎么设置格式显示的格式
    ajax异步处理时,如何在JS中获取从Servlet或者Action中session,request
  • 原文地址:https://www.cnblogs.com/chinaops/p/9464327.html
Copyright © 2011-2022 走看看