MySQL锁机制
Posted 刘叔一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL锁机制相关的知识,希望对你有一定的参考价值。
当并发事务同时访问一个资源的时候,有可能导致数据不一致。因此需要一种致机制来将访问顺序化。锁就是其中的一种机制。
数据库上的操作可以归纳为两中,读和写。多个事务同时读一个对象的时候,是不会有冲突的。
同时读和写或者同时写才会产生冲突。因此为了提高并发性,通常定义两种锁:
A. 共享锁(Shared Lock、S锁) 也叫读锁.
共享锁表示对数据进行读操作。因此多个事务可以同时为一个对象加共享锁。
B. 排他锁(Exclusive Lock、X锁) 也叫写锁.
排他锁表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。
C.意向锁(Intention Lock)意向读锁(IS)和意向写锁(IX)
在给一行记录加锁前,首先要给该表加意向锁,也就是同时要加表意向锁和行锁。
锁兼容矩阵
S | X | |
S | 兼容 | 不兼容 |
X | 不兼容 | 不兼容 |
总的来说,mysql各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。下面我们先分析一下MySQL这三种锁定的特点和各自的优劣所在。
行级锁定(row-level)
通常用在DML语句中,如INSERT, UPDATE, DELETE等。
行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
表级锁定(table-level)
通常用在DDL语句中,如DELETE TABLE,ALTER TABLE等。
和行级锁定相反,表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。
当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。
页级锁定(page-level)
页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
以上是关于MySQL锁机制的主要内容,如果未能解决你的问题,请参考以下文章