Mysql 锁
- 表锁
意向锁:当表锁事务去访问行锁资源,那么行锁会升级成意向锁
自增锁:当自增列存在插入事务时,自增列会获取自增锁,其他事务都要等待。
- 行锁
Record lock: 对索引加锁(主键范围存在)
Gap lock:对索引项之间的间隙加锁(主键范围不存在)
Next-key lock:索引项在范围,又不在范围
-- id 就到50 select * from table where id >49; -- 说明 存在部分记录存在,还有不存在的范围
锁的具体实现
- 共享锁:事务对数据添加了读锁,事务只能读而不能修改,其他事务也只能加读锁,期间不能修改,直到事务释放读锁
- 排他锁:事务获取写锁后,只有自己可以操作(读取或者修改),而其他事务不能操作
死锁
- 定义:指的是两个或两个以上的进程在执行的过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
- 示例1 不同表记录行锁冲突
事务A | 事务B |
---|---|
delete from t1 where id =1 | |
update t2 set name = ‘sss’ where id = 2 | |
update t2 set name = ‘sss’ where id = 2 | |
delete from t1 where id =1 |
- 示例2 相同表记录行锁冲突
事务A | 事务B |
---|---|
update t2 set name = ‘sss’ where id = 1 | |
update t2 set name = ‘sss’ where id = 2 | |
update t2 set name = ‘sss’ where id = 2 | |
update t2 set name = ‘sss’ where id = 1 |
- 解决办法
- 使用索引,让锁更精确
- 合理选择事务大小,小事务发生所冲突更小
- 确定好事务的顺序,尽量按约定顺序存取数据