MySQL 锁
按粒度分类
全局锁
对数据库实例加锁;
比如场景需要主从手动切换,可以 执行 flush table with read lock, 锁库;
表级锁
对整个表锁定;
myisam 默认
行级锁
对表的行进行锁定;
页级锁
BDB 引擎下,可以使用;
按模式分类
乐观锁
每次操作数据时都认为没有其他人会更改数据;
需要业务层实现, 常规都是加自增版本号, 更新时带版本号与事务内版本比较, 相同则提交;
悲观锁
每次操作数据时都认为其他人会更改数据;
按属性分类
共享锁
读锁(S 锁), 加锁期间, 其他事务允许读取, 不允许修改;
select ... lock in share mode;
排他锁
写锁(X 锁), MySQL 引擎自己实现;
比如 InnoDB , insert 、update、delete 都会为对应数据加上锁, select 不会加锁;
间隙锁
介绍
死锁问题
1、环境数据准备
8.0.22 版本, 表 gap_lock_test 两个字段 id、name, id 是主键, 手动插入 3 条数据 1、10、20;
隔离级别 RR;
2、开事务操作
评论