2.表级锁
表级锁的粒度也较大,作用整张表,容易造成锁冲突,并发度低。
2.1表锁
分类:
表共享读锁(read lock)
表独占写锁(write lock)
语法:
加锁:lock tables 表名 read/write;
释放锁:unlock tables/关闭客户端
锁住特点:
读锁:所有进程可读,所有进程不可写
写锁:当前上锁进程可读写,其余进程不可读写
2.2元数据锁
这里的元数据,可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。避免dml和ddl语句发生冲突。
元数据锁不用显示操作,mysql执行语句时自动加的。主要注意exclusive就是元数据的排他锁(写锁,修改元数据的时候加),平常增删改查的时候就是元数据共享锁。
查看元数据锁:
select object_type,object_schema,object_name,lock_type,lock_duration from
performance_schema.metadata_locks ;
2.3意向锁
加表锁的时候,需要每行遍历行锁,防止冲突,效率很低。innodb引入意向锁,来减少加表锁时的检查。
【意向锁,我的理解就是行锁在表级的一个标志,加表锁的时候需要查看意向锁,防止加的表锁和已经有的行锁冲突】
分类:
意向共享锁(IS) 与表共享读锁兼容,与表排他写锁互斥。
【我的理解是本质是行锁和 表锁的关系。行锁的读锁会和表读锁是兼容的,都允许读数据。行读锁和表写锁肯定互斥,读锁不允许写数据】。
意向排他锁(IX)与表读锁,写锁都互斥。
【我理解和上面一样,说明行锁是写锁,那自然不能再读写】
意向锁之间不会互斥。
【我的理解是因为操作的是不同行数据】
语法:
IS:select语句后面加 lock in share mode。
IX:增删改查语句后面加for update。