Mysql有多少种锁,怎么写加锁的SQL语句

什么是数据库锁数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则 。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外 。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别 。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定 。
表级锁定(table-level)表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制 。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小 。所以获取锁和释放锁的速度很快 。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题 。
当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣 。
使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎 。
行级锁定(row-level)行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的 。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能 。
虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端 。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了 。此外,行级锁定也最容易发生死锁 。
使用行级锁定的主要是InnoDB存储引擎 。
页级锁定(page-level)页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见 。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间 。另外,页级锁定和行级锁定一样,会发生死锁 。
在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂 。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升 。
使用页级锁定的主要是BerkeleyDB存储引擎 。
三种锁的区别

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
  3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 。
适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统 。
表级锁定由于MyISAM存储引擎使用的锁定机制完全是由MySQL提供的表级锁定实现,所以下面我们将以MyISAM存储引擎作为示例存储引擎 。
1.MySQL表级锁的锁模式
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock) 。锁模式的兼容性:
对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;
MyISAM表的读操作与写操作之间,以及写操作之间是串行的 。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作 。其他线程的读、写操作都会等待,直到锁被释放为止 。
2.如何加表锁
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁 。
3.MyISAM表锁优化建议
【Mysql有多少种锁,怎么写加锁的SQL语句】对于MyISAM存储引擎,虽然使用表级锁定在锁定实现的过程中比实现行级锁定或者页级锁所带来的附加成本都要小,锁定本身所消耗的资源也是最少 。但是由于锁定的颗粒度比较到,所以造成锁定资源的争用情况也会比其他的锁定级别都要多,从而在较大程度上会降低并发处理能力 。所以,在优化MyISAM存储引擎锁定问题的时候,最关键的就是如何让其提高并发度 。由于锁定级别是不可能改变的了,所以我们首先需要尽可能让锁定的时间变短,然后就是让可能并发进行的操作尽可能的并发 。


推荐阅读