锁是计算机协调多个进程或者线程并发访问某一资源的机制。
MySql中的锁分为三类-->全局锁、表级锁、行级锁
1. 全局锁就是对整个数据库实例加锁,加锁后的整个实例处于只读状态。可以保证数据的一致性、完整性。(flush tables with read lock;)
2. 表级锁就是锁着整张表。主要分为三类-->表锁、元数据锁、意向锁
表锁分为表共享读锁和表独占写锁
加锁-->lock tables 表名 read/write; 释放锁-->unlock tables
元数据锁-->元数据锁过程是系统自动控制,无需显示使用,在访问一张表时会自动加上。维护数据的一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
意向锁-->为了避免元数据锁在执行时,加的行锁和表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向共享锁-->与表锁共享锁read兼容,与表锁排它锁write互斥.
意向排他锁-->与表锁共享锁read及排它锁write都互斥。意向锁之间不会互斥
3.行级锁就是锁行数据。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加锁。主要分为三类-->行锁、间隙锁、临键锁
行锁-->锁定单个行记录的锁,防止其他事务对此进行update/delete。
间隙锁-->锁定索引记录间隙(不含记录),确保索引记录间隙不变,防止其他事务在间隙中insert,产生幻读。
临键锁-->行锁和间隙锁的组合。