mysql锁

锁:

  • 锁是对索引的锁,事务提交后才解锁。不走索引则锁表。

  • 全局锁:flush tables with read lock开启 unlock tables关闭。MyISAM 这种不支持事务的引擎,在备份数据库时就要使用全局锁的方法。innodb可以使用可重复读隔离级别避免使用全局锁影响业务。

  • 表级锁:分为表锁、元数据锁(MDL)、意向锁、AUTO-INC锁

    • 表锁:lock tables t_student read;开读锁。lock tables t_stuent write;开写锁。表锁阻塞其他线程也阻塞本线程。unlock tables解锁,尽量避免使用,粒度太大影响性能。
    • 元数据锁:对数据库表进行操作时,会自动给这个表加上 MDL。但在事务提交后才会释放,事务执行期间,MDL 是一直持有的。
    • 意向锁:用于表示对某一范围内的资源(如表、页、行等)存在锁的意图。它并不直接用于实际的数据行或页级别的锁定,而是作为一种指示,通知其他事务该范围内可能存在锁。意向锁的目的是为了快速判断表里是否有记录被加锁。对表里对某些记录加上「共享锁」之前,需要先在表级别加上一个「意向共享锁」;InnoDB 引擎的表里对某些纪录加上「独占锁」之前,需要先在表级别加上一个「意向独占锁」;如果其他事务已经持有了意向共享锁,那么该事务就知道在该表上可能存在共享锁,从而可以避免直接获取排他锁,减少了不必要的等待和冲突。使用意向锁能够提高数据库的并发性能,并且避免死锁问题。
    • AUTO-INC锁:锁不是再一个事务提交后才释放,而是再执行完插入语句后就会立即释放在插入数据时,会加一个表级别的 AUTO-INC 锁,然后为被 AUTO_INCREMENT 修饰的字段赋值递增的值,等插入语句执行完成后,才会把 AUTO-INC 锁释放掉。大量数据下该锁效率较低,后采用轻量级的锁来实现自增。轻量级锁当 innodb_autoinc_lock_mode = 2 时,并且 binlog_format = row,既能提升并发性,又不会出现数据一致性问题
  • 行级锁:InnoDB 引擎支持行级锁,而 MyISAM 引擎不支持行级锁。共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。

    • //对读取的记录加共享锁select … lock in share mode;
      //对读取的记录加独占锁select … for update;加锁必须在一个事务里,事务提交锁会释放

    • Record Lock,记录锁,也就是仅仅把一条记录锁上;

      • (S 型与 X 锁不兼容);加S锁后可以继续加S锁,但不能加X锁
      • (X 型与 X 锁不兼容);加X锁后不能继续加S锁和X锁
    • Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;

      • 只存在于可重复读隔离级别,解决可重复读隔离级别下幻读的现象
      • 间隙锁X锁与S锁之间是兼容的
    • Next-Key Lock临键锁:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的

    • 插入意向锁:判断插入位置是否已被其他事务加了间隙锁,如果有的话,插入操作就会发生阻塞,直到拥有间隙锁的那个事务提交为止,在此期间会生成一个插入意向锁,表明有事务想在某个区间插入新记录,但是现在处于等待状态。

      • 插入意向锁 不是意向锁,它是一种特殊的间隙锁,属于行级别锁,不能一个事务持有间隙锁,一个事务同时持有该记录范围的插入间隙锁。
      • 事务生成插入意向锁后是阻塞状态,不算 持有 插入间隙锁
    • mysql怎么加锁:

      • update 和 delete 操作都会加行级锁,且锁的类型都是独占锁(X型锁)

         //对操作的记录加独占锁(X型锁)
         update table .... where id = 1;
         //对操作的记录加独占锁(X型锁)
         delete from table where id = 1;
        
      • 在读已提交隔离级别下,行级锁的种类只有记录锁,也就是仅仅把一条记录锁上。

      • 在可重复读隔离级别下,行级锁的种类除了有记录锁,还有间隙锁,Next-key-lock锁

      • 加锁的对象是索引,加锁的基本单位是 next-key locknext-key lock 是前开后闭区间,而间隙锁是前开后开区间在能使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁

你可能感兴趣的:(mysql,mysql,数据库)