引言:有死锁,一定是并发造成,同一事物不会出现死锁,为什么要分析死锁图?因为这是找死锁根源的第一步。看懂了图才能做后面的事情。在百度上看到的死锁图,基本都是由于sql语句得写法导致了锁表。下面我就要说下死锁图中重要的信息。
死锁图
这个是死锁图,看起来好像很复杂,其实很简单,我们不需要全部看懂,为了后面分析死锁产生的原因,只需看懂我们需要的部分就可以了。
1.整体观察
a.左边椭圆是执行的sql1,鼠标悬停上面会有显示执行语句,蓝色叉子表示被牺牲掉了。
b.右边椭圆是执行的sql2,正常执行,没有牺牲,为什么牺牲左边呢?因为sqlserver会自动牺牲占用资源较小的事物。
c.上面方框锁对象1,这里我们能看看到是table_1这个表。
d.下面方框锁对象2,table_2这个表。这里的锁的对象不一定是表,我这里只是举个例子,可以是执行过程中任何对象,比如还可能是索引对象。
2.对象资源竞争关系
首先我们要明白锁的概念,S:共享锁,X:排他锁(独占锁),U:更新锁。
a.左边SQL1,首先获得表对象table_2的X锁,又请求表对象table_1的S锁(此时表对象table_1被SQL2的X锁锁住)。
b.右边SQL2,首先获得表对象table_1的X锁,又请求表对象table_2的S锁(此时表对象table_2被SQL1的X锁锁住)。
这样就发生了表对象的资源竞争,于是死锁出现了。(自动牺牲掉占用资源小的事物)。
通过死锁图需要知道的重要信息:锁的对象,只有知道了锁了什么,才能够找到根本原因,可能是表,可能是索引,可能是其他的对象(我也没了解辣么深啦!)。
PS:看完这部分,是否看懂了死锁图?是否有点启发呢?上面为什么会出现各种锁?详细分析待续更新。。。支持请留言吧。好让我知道你们在看,我不是在自娱自乐!