Mysql 中DDL,DML,DCL,DQL详解

DDL,DML,DCL,DQL详解

1. DDL(data defination language)数据库定义语言

概念:
数据库定义语言,主要是建表、删除表、修改表字段等操作
锁机制:
online DDL 触发表级锁的条件 (备注:允许为Yes 即不会锁表, No表示不允许此时就会锁表
(备注:in-place与copy为online DDL的实现方式
Mysql 中DDL,DML,DCL,DQL详解_第1张图片

2. DML(data manipulation language)数据操作语言

概念:
数据操作语言,主要是数据库增删改三种操作
锁机制:
对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
表级锁
在MySQL5.5版本引入MDL,当对一个表进行增删改查操作时,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁

  • 读锁之间不互斥,因此可以有多个线程同时对一张表进行增删改查
  • 读写锁之间,写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另外一个执行完才能开始执行。

给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。在对大表操作的时候,需要特别小心,以免对线上服务造成影响。
事务中的MDL锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。

3. DCL(data control language)数据库控制语言

概念:
数据库控制语言,如commit,revoke之类的,在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
锁机制:

4. DQL(data query language)数据查询语言

概念:
数据查询语言 select操作

锁机制:
表级锁
在Repeatable Read级别下,读操作需要加S锁,但是在事务提交之前并不释放S锁,也就是必须等待事务执行完毕以后才释放S锁。
在Serializable级别下,此时所有select语句都会被隐式加锁:select … in share mode.

在MySQL5.5版本引入MDL(meta data lock,MDL)元数据锁,当对一个表进行增删改查操作时,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁

  • 读锁之间不互斥,因此可以有多个线程同时对一张表进行增删改查
  • 读写锁之间,写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另外一个执行完才能开始执行。

给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。在对大表操作的时候,需要特别小心,以免对线上服务造成影响。
事务中的MDL锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。

补充

共享锁【s锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但是在T释放A上的S锁之前不能对A做任何修改。

排他锁【X锁】
又称写锁,若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁,这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

你可能感兴趣的:(Mysql,数据库,mysql)