1. 锁机制的意义

MVCC机制解决了多少事务并发运行时,如果同时读写一批数据,此时读和写时间的关系是如何协调单额,毕竟要是你不协调好的好,可能就会有脏读、不可重复读、幻读等一系列问题。
但是多个事务同时并发更新一行数据的时候,会出现脏写的问题。那么怎么防止脏写的出现呢,靠锁机制。

2. 锁机制运行过程

锁机制.png
锁机制 (1).png

3. 独占锁和共享锁

(1)多个事务同时更新一行数据,会加独占锁。不能同时更新,防止脏写
(2)当一个事务在更新数据的时候,其他事务可以读到这行数据。通过mvcc 控制,查询时不加锁
(3)查询时也可以加锁

  • 加共享锁,就是S锁,语法如下:select * from table lock in share mode
  • 独占锁,即X锁,语法如下:select * from table for update | 锁类型 | 独占锁 | 共享锁 | | —- | —- | —- | | 独占锁 | 互斥 | 互斥 | | 共享锁 | 互斥 | 不互斥 |

4. 表级锁

有人可能会认为当你执行增删改的时候默认加行锁,然后执行DDL语句的时候,比如 alter table 之类的语句,会默认在表级别去加锁。虽然不太对,但是有一定的道理,因为确实执行DDL的时候,会阻塞所有的增删改的操作;执行增删改的时候,会阻塞DDL操作。
但是这是通过 MySQL 通用的元数据锁实现的,也就是Metadata Locks,不是表锁。因为表锁其实是InnoDB 存储引擎概念,InnoDB 存储引擎提供了自己的表级锁,跟这里的DDL语句用的元素锁不是一个概念。
表锁通过如下的语法来加:
(1)LOCK TABLES xxx READ: 这是加表级共享锁
(2)LOCK TABLES xxx WRITE: 这是加表级独占锁
但是几乎没人会取用。
其实平时我们操作数据库,比较常见的两种表锁,反而是更新和查询操作加的意向独占锁和意向共享锁,但是整个意向独占锁和意向共享锁根本不会互斥,就当不存在就好。
但是手动加表级锁和独占锁,以及更新和查询的时候自动在表级加的意向共享锁和意向独占锁之间有一定的互斥关系。