MySQL的锁定主要分为全局锁、表锁、行锁
一.全局锁
MySQL全局锁是针对整个数据库的锁。
全局锁又可分为读锁和写锁
1.读锁(共享锁):它阻止其他用户更新数据,但允许他们读取数据。
2.写锁(排他锁):它阻止其他用户读取和更新数据。
MySQL全局锁的典型应用场景是,进行一些需要确保整个数据库一致性的操作,例如全库备份
、全库导出等。
可以使用flush tables with read lock语句来添加全局读锁;
使用unlock tables语句来释放锁;
全局锁的开销非常大,它会阻止其他所有数据的修改操作,并且在高并发情况下可能导致大量线程的锁定。
二.表锁
表锁是MySQL中最基本的锁策略,是MySQL最早采用 的表策略。表锁的特点是开销小、加锁快、不会产生死锁;并发度最低。
表锁有两种模式:
读锁(共享锁):当一个事务获取了表的读锁后,其他事务任然可以对表进行读操作,但不能进行写操作。直到该表释放。
写锁(排他锁):当一个事务获取了表的写锁后,这个事务可以对该表进行读和写操作,但是其他事务不能再对该表进行任何操作。
锁定表使用 lock tables 表名 read; //加读锁
使用unlock tables语句来释放锁;
表锁的风险:
性能下降:因为表锁会锁定整个表,所以在高并发的环境中,它可能导致大量的请求阳寨从而降低性能。对于读取和写入混合密集的负载,表锁可能会成为一个性能瓶颈
并发性能差:表锁的最大问题在于其并发性能。一旦一个线程对表获得了写锁,其他线程的任何读写操作都会被阻塞,直到写锁被释放。同样的,如果一个读锁被持有,那么其他的写操作将被阻塞。这就使得并发性能大大降低
可能导致锁等待和超时:在高并发的环境中,由于表级锁的粒度较大,可能会有很多线程在等待锁,如果等待的时间过长,可能会导致锁超时,进一步影响应用的性能和可用性。
写操作影响大:如果一个长时间运行的写操作(比如大数据量的UPDATE或者INSERT语句)获取了写锁,那么会阻塞所有其他的读操作和写操作,直到这个写操作完成
死锁的可能性:虽然表锁本身不会出现死锁,但在多表操作中,如果没有按照一定的顺序获得锁,可能会导致死锁。
为了避免这些问题,我们通常会选择InnoDB存储引擎,它主要使用行级锁,可以提供更好的并发性能,并且在一定程度上减少了锁争用的问题。而且,innoDB还支持事务,可以保证数据的一致性和完整性。在实际应用中,我们应该根据具体的业务需求和系统负载,选择合适的存储引擎和锁策略
三.行锁
行锁可以对数据库表中的单独一行进行锁定,相比于表锁和全局锁,行锁的粒度更小,因此,在处理高并发事务时,能提供更好的并发性能和更少的锁冲突。然而,行锁需要更多的内存和cpu资源,因为需要对每一行进行管理
在MySQL中,行级锁主要由InnoDB存储引擎提供。InnoDB支持两种类型的行级锁: 共享锁(S锁) 和排他锁 (X锁)。
1.共享锁 (S锁):共享锁也称为读锁,它允许一个事务读取一行数据。当一行数据被共享锁锁定时,其他事务可以读取这行数据,爬不能对其进行修改。
2.排他锁(X锁):排他锁也称为写锁,它允许一个事务读取和修改一行数据。当一行数据被排他锁锁定时,其他事务不能读取也不能修改这行数据。
值得注意的是,行级锁只在事务中有效,也就是说,只有在一个事务开始 (BEGIN)后并在事务提交 (COMMIT)或回滚(ROLLBACK) 之前,才能对数据行进行锁定。如果在非事务环境中执行SQL语句,那么InnoDB会在语句执行结束后立即释放所有的锁。
MySQL中的行级锁 (Row Level Locks) 通常在以下几种场景中被使用:
1.高并发读写操作: 在需要高并发读写操作的场景中,行级锁可以提高性能和并发性,因为它允许多个事务并发地操作不同的行。
2.单行操作:对于需要操作单行数据的SQL语句 (例如基于主键或者唯一索引的UPDATE.
DELETE和INSERT语句),行级锁可以提供较好的并发性和性能。
3.短期锁:在需要对数据行进行短时间锁定的情况下,行级锁可以防止长时间阻塞其他事务。
4.实现并发控制:在需要确保数据一致性和隔离性的事务中,行级锁是实现并发控制的重要机制。
5.复杂的事务处理: 在需要对多行数据进行复杂处理的事务中,可以使用行级锁来锁定这些行,防止在事务处理过程中数据被其他事务修改。使用行级锁需要注意,由于行级锁的锁定粒度较小,它可能会消耗更多的系统资源 (例如内存和CPU),特别是在处理大量数据时。此外,使用行级锁也可能导致死锁,需要使用合适的策略来避免死锁,例如在事务中按照一定的顺序锁定行。
MySQL哪些命令会导致行锁:
在MySQL中,主要是InnoDB存储引擎提供了行锁。一般来说,以下这些类型的操作会导致InnoDB对数据行进行枷锁:
1.SELECT...FOR UPDATE:这种查询会对选定的行添加一个排他锁(X锁),这意味着其他事务不能修改这些行,也不能对这些行添加共享锁。
2.SELECT...LOCK IN SHARE MODE这种查询会对选定的行添加一个共享锁,这意味着其他事务不能修改这些行,但可以对这些行添加共享锁。
3.INSERT:插入操作会对新添加的行添加一个排他锁(X锁)
4.UPDATE:更新操作会对被更新的行添加一个排他锁(X锁)
5.DELETE:删除操作会对被删除的行添加一个排他锁(X锁)