mysql中主要有以下几种锁
1.共享锁(也称读锁)
用于读取的操作, 允许一个事务读取一行数据, 也能允许多个事务读取同一行数据, 但却不能允许其他的事务对这条数据上锁, 比如添加排他锁, 也称为写锁, 在锁释放前, 其他的事务看到的数据都是锁定时刻的数据快照
SELECT ... LOCK IN SHARE MODE;
2.排他锁(也称读锁)
排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的锁。获得排他锁的事务既能读数据,又能修改数据。
SELECT ... FOR UPDATE;
注意, 这条会对命中的所有数据的索引 添加排他锁, 当没有索引时会锁表, 当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。
3.行锁
锁定数据库表中的某一行记录, 减少锁的冲突以便于提升性能 .mysql添加行锁的时候并不是锁这条数据, 而是锁上这条数据的主键索引, 如果操作的非主键索引, 则会先找到根据这条数据的非主键索引, 对主键索引加上锁
4.意向锁
背景: 事务A对表Table1中的一行加上了行级锁,这时候这行记录就只能读不能写了。事务B申请对Table1增加了表级锁,如果他申请成功了,那么他就可以修改表中的任意一行记录。这就发生了冲突。那么,想要解决这个问题,就需要让事务B在对Table1增加表级锁的时候,先判断一下是不是有事务增加过行级锁。
分为意向共享锁(IS)和意向排他锁(IX) 为上方的共享锁和排他锁的条件
当一个事务请求获取一个表中的行锁或者表锁的时候, mysql会自动获取相对于的锁的意向锁, 这样,其他的事务获取表锁的时候吗可以基于意向锁来判断是否有其他事务是否加过锁, 并且根据类型来判断是否能获取锁, 这样的优点是可以在不阻塞其他事务的情况下, 为当前事务锁定, 防止并发操作时带来的问题
这里我们要注意, 意向锁他是一个表级别的锁, 能够在触发意向锁的事务提交或者回滚后释放
5.表锁
锁定整个数据表,不论事务涉及表中的多少行,都会锁定整个表。同时也分共享锁和排他锁
6.页级锁
锁定数据库存储中的一页数据(包含多行),锁定粒度介于行锁和表锁之间。
7.全局锁
锁定整个数据库实例,使得数据库处于只读状态。所有数据的增删查改及表结构修改操作都会被阻塞,直到全局锁被释放