数据库锁
一、引言
我们都知道,在单体应用系统中,数据库的事务具有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中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
优势:开销和加锁时间界于表锁和行锁之间;
劣势:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
作者:三石雨
出处:http://www.cnblogs.com/exceptioneye
再烦,也别忘微笑;再急,也要注意语气。
再苦,也别忘坚持;再累,也要爱自己。
低调做人,你会一次比一次稳健;高调做事,你会一次比一次优秀。