首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

经过dbcc page解析哪一行数据被锁住了

2013-10-29 
通过dbcc page解析哪一行数据被锁住了?如何通过dbcc page来知道哪一行数据被锁住呢?要想明白这个问题:首先

通过dbcc page解析哪一行数据被锁住了?

如何通过dbcc page来知道哪一行数据被锁住呢?


要想明白这个问题:

首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的一个比较极端的情况,就是死锁。

然后,需要知道如何监控死锁,否则,就算产生了死锁,你也不一定知道。这里在模拟死锁之前,通过SQL Profiler先来监控死锁问题。

接下来,我们可以通过sys.dm_tran_locks来获取更详细的阻塞信息。

最后,通过dbcc page来解析哪一行数据被锁住了。


下面就按照上面的步骤,一步一步来实现:

1、在构造死锁之前,先监控死锁。

先选择SQL Profiler:

经过dbcc page解析哪一行数据被锁住了

然后,新建跟踪,单击连接:

经过dbcc page解析哪一行数据被锁住了

接下来,选择“事件选择”选项卡,点击“显示所有事件”复选框,在其中点击“Locks”事件,在“Deadlock graph”复选框,这样在发生死锁的时候,就会被监控到,而且以图像的方式显示死锁的信息,易于理解:

经过dbcc page解析哪一行数据被锁住了


2、构造死锁。

先创建一个表



同时,能在SQL Profiler中看到监控到的死锁:

经过dbcc page解析哪一行数据被锁住了


从这个图中,我们可以看到详细的死锁信息,打叉的表示被回滚的会话,把鼠标放到椭圆上,会显示导致死锁的,这个会话正在运行的sql语句。

在长方形的框中,可以看到两个会话要获取X锁,左边的会话拥有下面方框中的键锁,右边的会话拥有上面的键锁,而当左边的会话想要获取上面的键锁是,被阻塞住了,而当右边的会话想要获取下面的键锁时,也被阻塞了,于是整个图像中形成了一个循环,也就导致了死锁。


3、获取更详细的阻塞信息。

注意,上面提到的会话X,这里是53,而会话Y是55,这个可以从上面图中,椭圆形中的“服务器进程ID”获得。

通过通过sys.dm_tran_locks,可以获取到更为详细的阻塞信息。



解析resource_associated_entity_id的值:



从上图中,我们能很清楚的看到(b9b173bbe8d5)和(98ec012aa510),就是id为3、6的两行数据,这两行数据最后被会话55锁住了。

热点排行