共享锁(Shared Lock),又称S锁、读锁。针对行锁。
当有事务对数据加读锁后,其他事务只能对锁定的数据加读锁,不能加写锁(排他锁),所以其他事务只能读,不能写。
主要为了支持并发读的场景,读时不允许写操作。
加锁方式:
select * from T where id=1 lock in share mode;
释放方式:
commit、rollback;
排他锁(EXclusive Lock),又称X锁、独占锁、写锁。针对行锁。
当有事务对数据加写锁后,其他事务不能再对锁定的数据加任何锁,又因为InnoDB对select语句默认不加锁,所以其他事务除了不能写操作外,照样是允许读的(尽管不允许加读锁)。
主要为了在事务进行写操作时,不允许其他事务修改。
加锁方式:
自动:DML语句默认加写锁
手动:select * from T where id=1 for update;
释放方式:
commit、rollback;
意向锁(Intention Lock),又称I锁。针对表锁。
当有事务给表的数据行加了共享锁或排他锁,同时会给表设置一个标识,代表已经有行锁了,其他事务要想对表加表锁时,就不必逐行判断有没有行锁可能跟表锁冲突了,直接读这个标识就可以确定自己该不该加表锁。特别是表中的记录很多时,逐行判断加表锁的方式效率很低。而这个标识就是意向锁。
主要是为了提高加表锁的效率。
加锁方式:
无法手动创建。
表级读锁:
lock table user_info read;
表级写锁:
lock table user_info write;