首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置CONTEXT_INFO选择context_info(),锁定

设置CONTEXT_INFO选择context_info(),锁定
EN

Stack Overflow用户
提问于 2010-01-08 12:02:19
回答 1查看 1.5K关注 0票数 1

假设表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模式锁是在读取系统进程时获得的。但真正的后果是,我没有把握,因为这是一个内部的对象。

请指点我。

你好,延斯·诺登布罗

  • 我不清楚,我知道CONTEXT_INFO是每个连接。我不认为SPID 1和SPID 2使用CONTEXT_INFO进行通信。它们是完全独立的,假设它们将CONTEXT_INFO用于不同的目的。我只是担心他们需要同样的锁资源。这才是真正的问题。
  • 你说暗示是什么意思?
EN

回答 1

Stack Overflow用户

发布于 2010-01-08 12:26:11

  • CONTEXT_INFO是每个连接
  • sysprocesses不是真正的表,您不能使用提示(例如使用TABLOCKX)

编辑,在OP的其他答案之后:

sysprocesses没有会影响代码的锁或争用。也就是说,您对CONTEXT_INFO的使用将不受系统进程内部发生的任何事情的影响。

至于“真正的桌子”。根据OBJECTPROPERTY的“OBJECTPROPERTY”测试,这是一个“假表”

桌子不是真的。它由SQL Server数据库引擎根据需要在内部实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2027386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档