之前的博客给小伙伴们分享了java中的锁,今天我们一起来看看mysql中有什么锁吧
一、图示
二、粒度分类
2.1、全局锁:
什么是全局锁?
MySQL的锁定主要分为全局锁、表锁和行锁。现在我们来看看MySQL全局锁。
MySQL全局锁是针对整个数据库的锁。最常用的全局锁是读锁和写锁。
2.1.1 读锁(共享锁):
它阻止其他用户更新数据,但允许他们读取数据。这在你需要在一段时间内保持数据一致性时很有用。
2.1.2 写锁(排他锁):
它阻止其他用户读取和更新数据。这在你需要修改一些大量的数据,并且不希望其他用户在这段时间内干扰时很有用。
MySQL全局锁的典型使用场景是,进行一些需要确保整个数据库一致性的操作,例如全库备份、全库导出等。
在MySQL中,可以使用 FLUSH TABLES WITH READ LOCK(FTWRL) 语句来添加全局读锁,这将阻止其他线程进行更新操作。使用UNLOCK TABLES语句来释放锁定。使用解锁表语句来释放定。
请注意,全局锁的开销非常大,因为它会阻止其他所有的数据修改操作,并且在高并发情况下可能导致大量的线程等待锁定。因此,你应该尽量避免在生产环境中使用全局锁,或者尽量减少全局锁的持有时间。
虽然全局锁有其应用场景,但是过度使用或不正确使用全局锁可能导致性能问题。因此,根据应用的特性和需求选择适合的锁策略是很重要的。对于大多数应用,优先使用更精细粒度的锁,如行锁和表锁,可以更有效的处理并发请求,同时避免全局锁的开销
2.2、表级锁
什么是表级索?
表级锁是MySQL中最基本的锁策略,是MySQL最早采用的锁策略。表级锁的特点是开销小,加锁快,不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。表锁有两种模式:
2.2.1 表共享读锁(Table Read Lock) :
又称为表读锁,允许一个事务锁定的表进行读取操作,不允许其他事务对其进行写操作,但是可以进行读操作。读锁之间是不会互相阻塞的。
2.2.2 表独占写锁(Table Write Lock) :
又称为表写锁,允许一个事务锁定的表进行读取和写入(更新)操作,但是其他任何事务都不能再对该表进行任何操作,必须等待表写锁结束。写锁会阻塞其他所有锁,包括读锁和写锁。
在MySQL中,对MyISAM表的读操作,会自动加上读锁,对MyISAM表的写操作,会自动加上写锁。
InnoDB引擎在必要情况下会使用表锁,但主要是使用行锁来实现多版本并发控制(MVCC) ,它能提供更好的并发性能和更少的锁冲突。
总的来说,表锁适用于读操作多、写操作少的应用,当并发争用不是特别激烈,以及记录级锁并发控制开销大于访问冲突开销的情况。在并发度高,或者写操作较多的情况下,表锁可能会成为瓶颈。
2.2.3 那么表级锁有哪些使用场景呢?
2.2.3.1 读密集型应用:
如果你的应用主要进行读取操作,很少进行写入操作,那么使用表级锁可能是一个好选择。因为表级读锁不会阻塞其他的读锁,所以这种场景下表级锁能够提供很高的性能。
2.2.3.2 写操作不频繁的场景:
表级锁对写操作的处理并不高效,因为一个写锁会阻塞所有其他的锁,无论它们是读锁还是写锁。但是,如果你的应用不需要频繁地进行写操作,或者可以容忍写操作的延迟,那么使用表级锁可能是可行的。
2.2.3.3 数据量不大的简单应用:
如果数据库的数据量不大,那么即使在写操作中,由于锁定整张表,对性能的影响也不大
2.2.3.4 全表更新或者删除:
在某些情况下,可能需要对一张表进行全表的更新或者删除操作,例如,删除表中的所有记录,或者更新表中所有记录的某个字段的值,在这种的情况下,使用表级锁是合适的。
但要注意,虽然表级锁的开销较小,但由于其锁定的粒度大,可能会导致并发度下降,特别是在写操作较多或者并发度较高的场景下。所以,如果应用的并发度较高,或者需要频繁进行写操作,那么可能需要考虑使用更精细粒度的锁,如行锁。
2.2.4 MySQL哪些命令会发生表级锁
2.2.4.1 ALTER TABLE:
这个命令用于更改表的结构,如添加列、删除列、改变列的类型等。执行
这个命令的时候,MySQL需要锁定整个表以防止在更改过程中有新的数据写入。
2.2.4.2 DROP TABLE 和 TRUNCATE TABLE:
这两个命令都会导致表级锁。DROP TABLE命令会
删除整个表,而TRUNCATE TABLE命令会删除表中的所有数据。在执行这些命令的时候,
MySQL需要锁定整个表以防止在删除过程中有新的数据写入。
2.2.4.3 LOCK TABLES:
这个命令可以显式地为一个或多个表加上读锁或写锁。LOCK TABLES命
令后面可以跟上一系列的表名和锁模式,用来指定需要锁定哪些表,以及使用什么样的锁模
式。例如,LOCK TABLES t1 WRITE,t2 READ;命令会给表t1加上写锁,给表t2加上读锁。
2.2.4.4 全表扫描或大范围扫描:
对于MyISAM存储引擎,全表扫描或大范围扫描会触发表级锁
2.2.4.5 FLUSH TABLES WITH READ LOCK(FTWRL):
这个命令可以给所有表加上全局读锁&#