死锁
大约 3 分钟
死锁
数据库中的死锁
MyISAM 表锁是 deadlock free 的, 这是因为 MyISAM 不支持事务,只支持表锁,而且总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。

在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,即锁的粒度比较小(行锁),这就决定了在 InnoDB 中发生死锁是可能的
死锁问题一般都是我们自己的应用造成的,和多线程编程的死锁情况相似,大部分都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题。因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按,以防止锁冲突导致死锁问题
死锁场景以及解决办法
死锁出现的场景如下:
事务1成功获取行锁1 事务2成功获取行锁2 … 事务1无法获取行锁2,被阻塞的同时也无法释放行锁1 事务2无法获取行锁1,被阻塞的同时也无法释放行锁2

此时所有的事务都阻塞住了,相当于进程内的所有线程都阻塞住了,发生了死锁问题
解决死锁办法:多个事务/线程获取多个相同资源锁的时候应该。与此同时,
操作
设置自动提交 以及 可重复读隔离级别,开启事务

查询一下表数据,在可重复读隔离级别

事务1获取id=7的排他锁,事务2获取id=8的排他锁()

事务1再次获取id=8的排他锁,发生阻塞

事务2再次获取id=7的排他锁

此时
两个事务发生死锁时,MySQL Server会选择一个事务释放锁并进行rollback