Mysql 锁 死锁

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
  • 解决办法
    • 使用索引,让锁更精确
    • 合理选择事务大小,小事务发生所冲突更小
    • 确定好事务的顺序,尽量按约定顺序存取数据

猜你喜欢

转载自blog.csdn.net/Zaric_001/article/details/113959396