「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
死锁通常是对于资源占用之后,没有及时的释放,导致了资源一直被锁定的状态。
1.解除死锁的方法:
本质上是将当前的进程从死锁的状态解脱出来;
在实际工作用,主要是用于 银行家算法和资源分配法这两种方式来避免死锁。
2.MySQL的死锁问题:
在Mysql,默认的存储引擎是InnoDB,其中这个引擎是会产生死锁的问题,这个是行锁级别的问题,
其中这个InnoDB存储引擎,---->等待图;
如果发生死锁,等待图会如何做呢?
在运行过程中,等待图的方式会检测死锁,如果发生死锁,就会自动的回滚一个事务。
一般是MySQL的中,可以这样做避免死锁?
-
索引避免无效索引,导致行锁升级为表锁
-
设计索引,尽量缩小锁的范围
-
控制特定事务的大小,加锁操作在事务的最后执行,尤其是写操作;
-
使用低级别的事务隔离机制
InnoDB中Mvcc原理
其中这个数据库中的MVCC的机制主要用于并发操作下的数据更新以及CRUD。
本质上是,MVCC机制是对于数据库中数据某个时间点的数据快照,
也就是说,同一个读的操作,按照相同的条件查询数据,在当前情况下,查到的结果都是一样的,
但是从另外一个角度看,不同事务,在同样时间中,看到的数据表中的数据也可能是不同的。
MVCC的组成机制
Mvcc的机制是通过每行数据表记录后面两个具体的列(隐藏)来实现的;
其中一列会保存行的创建本号,另一个是保存行的过期版本号;
用于对于每次事务开始之前,和每行之前记录的版本号进行对比。
一般是新的事务,就会递增这个版本号