常见锁的分类
- 行锁
- 对特定行加锁
- 表锁
- 对整张表加锁,其他事务不能对这张表进行读写操作
- 意向锁
- 一种表锁,分意向共享锁和意向排他锁,是行数和表锁的结合
- 共享锁
- 允许多个事务同时读取数据,但是不能修改,锁释放后才能获得排他锁
- 排它锁
- 只允许一个事务进行读写,其他事务不能访问该资源
- 元数据锁
- 对数据库对象(如表或索引)的元数据的一种保护,防止修改DDL时,其他事务对这些对象进行修改。
- 间隙锁
- 对两个数据间进行加锁,防止其他事务在这个间隙插入数据
- 临间锁(next-key lock)
- 行锁和间隙锁的结合,锁定具体行和前面的间隙,常用于可重复读
- 插入意向锁
- 一种等待间隙的锁,表示打算在这个间隙插入数据,其他事务可以读取,但是不能插入数据
- 自增锁
- 保证自增ID唯一
死锁
发生死锁怎么办
- MySQL会自动检测,发现死锁会回滚其中一个事务,用来解除死锁。通常回滚资源最少的那个事务
- 手动结束某个死锁线程,释放资源
SHOW ENGINE INNODB STATUS;找到线程IDKILL线程ID;手动执行命令
怎么优化
- 避免大事务
- 调整申请锁的顺序
- 更改事务的隔离级别
- 合理建立索引
- 开启死锁检测
