假设表T如下所用:
T0: SPID 1:开始事务.插入T(.)价值(.);.承诺;
时间T1 SPID 2:开始事务选择*从T,其中C=cval;.承诺;
假设事务隔离级别设置为可序列化。还假设SPID1设法在时间T1之前在T上使用TABLOCKX,而且SPID1正在做一个长事务,最终使SPID2等待T上的TABLOCKX发布。
现在,考虑使用CONTEXT_INFO而不是T的相同场景
T0: SPID 1:开始事务.设置CONTEXT_INFO=0xFF;结束;
T1 SPID 2:开始事务选择context_info();.结束;
同样,假设事务隔离级别设置为可序列化。
我知道CONTEXT_INFO是每个连接。我不认为SPID 1和SPID 2使用CONTEXT_INFO进行通信。它们是完全独立的,假设它们同时将CONTEXT_INFO用于不同的目的。
现在,由于TABLOCKX,不需要等待就可以执行select。事实上,由于使用CONTEXT_INFO进行锁定,我无法引发任何类型的等待。
这对我来说没什么,因为我需要这种行为。我的问题是,即使CONTEXT_INFO应该是Server中的"SPID-represenation“中的一个内存变量,它似乎存储在一个名为master.dbo.sysprocesses on MSSQL2000 (select context_info()将无法在这里工作)的表中,并存储在MSSQL后期版本的sys.sysprocesses中。
这些表在锁定方面不是像所有其他表一样吗?还是这些表只是变量的窗口,不遵守与其他表相同的规则?
另一件让我印象深刻的事情是,spt_values上的TAB类型、is模式锁被设置为context_info,而密钥类型、范围-S模式锁是在读取系统进程时获得的。但真正的后果是,我没有把握,因为这是一个内部的对象。
请指点我。
你好,延斯·诺登布罗
发布于 2010-01-08 12:26:11
编辑,在OP的其他答案之后:
sysprocesses没有会影响代码的锁或争用。也就是说,您对CONTEXT_INFO的使用将不受系统进程内部发生的任何事情的影响。
至于“真正的桌子”。根据OBJECTPROPERTY的“OBJECTPROPERTY”测试,这是一个“假表”
桌子不是真的。它由SQL Server数据库引擎根据需要在内部实现。
https://stackoverflow.com/questions/2027386
复制相似问题