讲在前面,正在学习mysql,试图做一些笔记归纳,欢迎大家来一起讨论
一、什么是锁
锁是应对资源并发访问的一种处理机制
二、锁分类
- 按操作分类
- 读锁(共享锁)
- 写锁(排他锁)
- 按粒度分类
- 行锁
- 表锁
三、锁运用
- 读写锁规律
- 读锁会阻塞写操作,写锁会同时阻塞读写操作
- 存储引擎和锁
- MyISAM引擎,查询前相关表自动添加读锁,增删改前相关表自动添加写锁
- InnoDB引擎,支持事务,事务中查询结果和事务隔离级别相关,事务中增删改操作会阻塞其他对同一条记录的写操作
- 锁注意事项
- CURD操作中查询使用非索引字段,行锁变表锁
- 范围CURD操作,容易造成间隙锁(范围内不存在的id记录也被锁)
- 表的读写锁
session | operation | table | result |
---|---|---|---|
session_1 | read | table A | Yes |
session_1 | write | table A | No |
session_1 | read | table X | No |
session_1 | write | table X | No |
session_x | read | table A | Yes |
session_x | write | table A | 阻塞 |
session_x | read | table X | Yes |
session_x | write | table X | Yes |
session | operation | table | result |
---|---|---|---|
session_1 | read | table A | Yes |
session_1 | write | table A | Yes |
session_1 | read | table X | No |
session_1 | write | table X | No |
session_x | read | table A | 阻塞 |
session_x | write | table A | 阻塞 |
session_x | read | table X | Yes |
session_x | write | table X | Yes |
四、锁指令
//给表添加读|写锁
lock table table_name read|write
//释放表锁
unlock tables;
//锁定某一行
begin;
select * from tableA where id=1 for update;
commit;
五、事务补充
- 事务的ACID
- Atomic(原子性),事务中所有操作被当作一个操作,要么全部完成,要么都不完成
- Consistent(一致性),数据库约束、级联操作、触发器机制都必须满足一致性。例如:删除记录中有外键约束,那么外键相关记录也应该被删除,这是ACID中的一致性
- Isolated(隔离性),主要用于并发控制,确保并发执行的事务能够顺序一个接一个执行,通过隔离,一个未完成事务不会影响另外一个未完成事务
- Durable(持久性),一旦一个事务被提交,它应该持久保存,不会因为其他操作冲突而取消这个事务
- 事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读 | 有 | 有 | 有 |
已提交读 | 无 | 有 | 有 |
可重复读 | 无 | 无 | 有 |
可序列化 | 无 | 无 | 无 |
补充说明
- 更新丢失:未开启事务,p1和p2修改同一条数据不同字段,p1、p2先后完成修改后提交,可能导致p2覆盖p1已更新字段,导致p1更新丢失
- 脏读:开启事务,p1读取到p2已修改但未提交的数据(脏数据)
- 不可重复读:开启事务,p1在事务内读取到p2已修改已提交的数据,导致同一事务内前后读取到数据不一致
- 幻读:开启事务,p1在事务内读取到p2已新增已提交的数据
- 查看当前隔离级别配置,mysql默认隔离级别是可重复读
show variables like 'tx_isolation';