Mysql的锁主要为全局锁、表锁和行锁。
全局锁是针对整个数据库的锁,最常用的是读锁和写锁
读锁(共享锁):允许读取数据,不允许修改数据,可以保持数据一致性
写锁(排他锁):在你修改数据时,阻止其他用户读取和更改数据
使用场景:全库备份,全库导出
使用FLUSH TABLES WITH READ LOCK来加锁,UNLOCK TABLES来解锁
表锁:当一个操作正在对表进行写操作时,会阻止其他操作对该表进行写入操作或者读操作。
主要有两种:表共享读锁,表独占写锁(其他对表进行写的操作会阻塞)
在Mysql中,MyISAM引擎下,进行读操作会自动加上读锁,写操作会自动加上写锁
InnoDB引擎下,必要情况会使用表锁,主要使用行锁来实现多版本并发控制(MVCC),
什么时候用表锁(不确定)
- MyISAM引擎下,不支持行锁,所以用表锁
- 需要进行大批量的批处理操作
- 防止死锁,在一些复杂的事务中,使用行锁可能导致死锁
- 表结构变更:AlTER TABLE时,通常会自动加表锁
- 事务隔离级别要求:一些事务对表的操作要求非常高,可以手动加锁
行锁:锁定单张表的一行
行级锁主要由InnoDB引擎提供,支持共享锁(S锁)和排他锁(X锁)
行锁只能在事务中有效
适合高并发环境下的 并发操作,频繁更新少量行的数据
命令:
- select …… for update(X锁)
- select ……lock in share mode(S锁)
- insert(X锁)
- update(X锁)
- delete(X锁)
间隙锁:锁定的不是具体的行记录,而是两条记录的间隙,可以防止新的记录插入到该间隙
主要为了解决幻读问题,即在一个事物中读取某个范围的记录时,另外一个事物插入了新的记录,当第一个事务再次读取该范围时,会发现本来不存在的记录
临键锁(next-key):可以理解为特殊的间隙锁(左开又闭),他是行锁和间隙锁的组合,在可重复读隔离级别下解决幻读,锁定的范围不仅包括具体的记录,还包括记录前后的间隙。
乐观锁:不对数据进行加锁,而是通过版本号、时间戳等机制在提交时检查数据是否被其他事务修改。如果没有修改则允许提交,如果发生了修改,则拒绝提交并抛出异常。
悲观锁:在数据操作之前,假设会发送冲突,因此在操作数据时会主动加锁
意向锁(表级锁)用来表明一个事务在对表中的某些行加锁之前,已经对这个表进行了加锁的操作。
意向共享锁和意向排他锁是Innodb存储引擎中实现行级锁和表级锁之间的协同机制。主要目的是在对表进行锁定的同时,避免潜在的死锁和提高并发性能,提供一种机制,以表明后续操作将申请共享锁,使得其他事务能快速判断表的锁定状态。
标签:对表,事务,加锁,行锁,记录,学习,Mysql,操作 From: https://blog.csdn.net/m0_63220670/article/details/142894908