数据库锁

一、引言                                                                                                                  

我们都知道,在单体应用系统中,数据库的事务具有ACID特性,其中一条保持了数据的一致性。我们来看下数据库的事务和锁。

DBMS事务通常是对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:

  • 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 
    在并发访问情况下,可能会出现脏读、不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念。

二、锁                                                                                                                      

当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。

锁就是其中的一种机制。

锁划分: 

  • 按操作划分:可分为DML锁、DDL锁 
  • 按锁的粒度划分:可分为表级锁、行级锁、页级锁 
  • 按锁级别划分:可分为共享锁、排他锁 
  • 按加锁方式划分:可分为自动锁、显示锁 
  • 按使用方式划分:可分为乐观锁、悲观锁 

DML锁(Data Manipulation Lock),用于保护数据的完整性,其中包括行级锁(Row Locks (TX锁))、表级锁(table lock(TM锁))。 

DDL锁(Data Definition Lock),用于保护数据库对象的结构, 如表、索引等的结构定义, 其中包括排他DDL锁(Exclusive DDL lock)、共享DDL锁(Share DDL lock)、可中断解析锁(Breakable parse Lock)。

注意点

分析锁的运作时,要记住mysql有一个autocommit参数,默认是on,它的作用使每一条单独的查询都是一个事务,并且自动开始,自动提交(执行完以后就自动结束了,如果你要适用select for update,而不手动调用 start transaction,这个for update的行锁机制等于没用,因为行锁在自动提交后就释放了),所以事务隔离级别和锁机制即使你不显式调用start transaction,这种机制在单独的一条查询语句中也是适用的。

1、行级锁

表示只针对当前操作的行进行加锁。行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。 

优势:锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 

劣势:开销大,加锁慢,会出现死锁;

2、表级锁

表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。表级锁是MySQL中锁定粒度最大的一种锁,最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。 

优势:开销小,加锁快;不会出现死锁; 

劣势:锁定粒度大,发出锁冲突的概率最高,并发度最低。

3、页级锁

其是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。 

优势:开销和加锁时间界于表锁和行锁之间; 

劣势:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

posted @ 2016-04-10 10:10  三石雨  阅读(452)  评论(0编辑  收藏  举报