1. 表锁

1.1. 共享读锁

1.2. 排他写锁

2. 行锁

  • 注意,若加锁操作涉及到的数据是全表的数据时,会对整个表加锁

    2.1. 共享锁

  • 共享锁又称为读锁,简称S锁。就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。与排他锁冲突

  • 使用方法:select * from table where id = 1 lock in share mode;

    2.2. 排他锁

  • 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存。

  • 如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
  • 使用方法

    • select * from table where id = 1 for update;
    • update table set name = ‘ccc’ where id = 1;

      2.3. 自增锁

  • 自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。当事务回滚或服务重启的时候,则这些自动增量值将“丢失”。一旦为自动增量列生成了一个值,就无法回滚该值。

  • innodb_autoinc_lock_mode选项及可选值

    • 0:“传统”锁定模式。
    • 1:“连续”锁定模式。
    • 2:“交错”锁定模式。在此模式下,自增值会在并发的连接之中交替生成,所以可能同一个连接执行后最终得到的自增键不是连续的。

      2.4. 间隙锁

      在Repeatable Read隔离级别下才存在

      2.5. 邻键锁

      在Repeatable Read隔离级别下才存在

      2.6. 意向锁

  • 由于表锁和行锁虽然锁定范围不同,但是会相互冲突。所以当你要加表锁时,势必要先遍历该表的所有记录,判断是否加有排他锁。这种遍历检查的方式显然是一种低效的方式,MySQL 引入了意向锁,来检测表锁和行锁的冲突。为此,MySQL提供了一个意向锁,在进行加锁操作的时候,需要先申请一个意向锁,这样当进行表锁的时候只需要检查是否存在意向锁就可以了。

  • 意向锁也是表级锁,也可分为读意向锁(IS 锁)和写意向锁(IX 锁)。当事务要在记录上加上读锁或写锁时,要首先在表上加上意向锁。这样判断表中是否有记录加锁就很简单了,只要看下表上是否有意向锁就行了。
  • 意向锁之间是不会产生冲突的,也不和 AUTO_INC(自增锁) 表锁冲突,它只会阻塞表级读锁或表级写锁,另外,意向锁也不会和行锁冲突,行锁只会和行锁冲突。

    2.6.1. 意向共享锁

    要对行加共享锁时,需要申请意向共享锁

    2.6.2. 意向排他锁

    要对行加排他锁时,需要申请意向排他锁