一、MySQL锁的定义
多事务直接操作同个数据可能会出现数据不一致问题,因此MySQL会对这些数据进行上锁。
二、MySQL锁的分类
1、根据实现区分
(1)悲观锁
若一个事务操作某条记录时,MySQL对它加上了悲观锁,则在该事务处理过程中,只能由该事务持有该记录的锁,其他事务只能排队等待,直到该事务处理完毕。
(2)乐观锁
若某条记录加上了乐观锁,可以有多个事务同时处理该条记录,当出现锁竞争情况时,则会通过比对版本号来判断是否允许操作。乐观锁的实现是通过在行记录上加上个版本号字段,在事务对该行记录进行操作之前,先判断版本号是否一致,是则继续操作,否则不进行操作。
2、根据操作类型区分
(1)独占锁(又叫写锁)
若某个事务持有某条记录的独占锁,则其他事务只能排队等待,直到该事务释放该锁。
InnoDB引擎会在RR级别上,对行数据的修改、删除、插入加上独占锁。
开发者可以使用SELECT ... FOR UPDATE语句,它
会加一个排他锁(X锁),其他事务不能对已锁定的记录进行更新或加入读锁。
(2)共享锁(又叫读锁)
若MySQL对某条记录加上了读锁,则多个事务可以并发读取该记录数据,但是不可以修改该记录的数据。
在MySQL中,当你执行查询操作时,默认情况下并不会加读锁。但是,如果你需要显式地对查询加锁,可以使用SELECT ... LOCK IN SHARE MODE
语句,它会加一个共享锁(S锁),其他事务可以读取但不能修改这些记录,直到事务结束。
注意:共享锁和独占锁是相互阻塞的。独占锁和独占锁是相互阻塞的。共享锁和共享锁是不阻塞的。
3、根据锁粒度区分
(1)全局锁
MySQL对整个数据库进行加锁。
(2)表级锁
a、定义
MySQL对整个表进行加锁。当存储引擎需要对行记录加锁,但是存储引擎不