1. 共享锁和排他锁
共享锁也叫s锁(share),写法
select xx from tt where ww lock in share mode;上S锁后,其他事务可读,不可改。
排他锁也叫x锁(exclusive),写法
select xx from tt where ww for update;
insert update delete都是排他锁。上X锁后,其他事务不可读和改。
在同一个事务中:
用了x再用x会阻塞
用了x再用s会阻塞
用了s再用x会阻塞
用了s再用s不会阻塞
2. 意向锁
意向锁都是表锁。
分为意向排他锁(IX)和意向共享锁(IS)。
意向锁的目的是为了加快上锁时的效率,不需要把每一行都遍历完就能知道这张表里有没有S或X锁。
意向锁是mysql自动加的,没法通过sql去加。
3. 锁的粒度
表锁和行锁。
只有innoDB有行锁。
innoDB下添加表锁的方式如下(一般在innoDB中不会用表锁,用处不大):
lock tables xxx read;表锁,共享锁
lock tables xxx write;表锁,排他锁
执行DDL语句(如alert、drop)时,会自动加上表锁。
如果表有自增字段,在插入数据的时候,也会有表锁。
索引上添加的才是行锁,否则都是表锁。如select xx from tt where ww for update如果没走索引,都是表锁,如果走了索引,就是行锁。
4. 间隙锁
上行锁的时候,会在该行前后记录之间加上间隙锁,防止其间数据变化,目的是解决这种情况下的幻读。