SQLServer出现 '其他会话正在使用事务的上下文' 的问题原因?

有时候同事真的是一种神奇的动物,经常能搞出一些没见过的问题跟错误。
项目中是使用DBLink(链接服务器;看到有些叫linkServer)在远程服务器上实现跨服务器跨数据库的操作。当然,一开始的项目使用的时候是单向读取远程数据库的数据或者调用远程存储过程,这个没有任何问题;但同事把DBLink用到他的项目中的时候就出现了这样的问题,我先是给他找了一些资料,大致是以下2种:

1、 查看一下该存储过程中是否有链接服务器指向本地,SQLSERVER2005不支持在分布式事务处理中存在指向本地的链接服务器(环回链接服务器)

2、 其原因是由于计算机名和sql server 2005的servername不一致所致。
解决方法: 先执行
select @@servername
查看数据库中的servername
然后执行:
sp_dropserver ’old_name’
go
sp_addserver ’new_name’, local
其中old_name为select
@@servername语句的结果,new_name为主机名

然后过了良久,同事跟我说没搞定。好吧,虽然我也半桶水,但是还是帮他看下。

结果看了才发现,确实不是上面的2种情况。

这货比较厉害…他2个库交叉使用了DBLink,额…大致是这样:


假设A(数据库Db1)、B(数据库Db2)两个服务器;
srvLinkB 是A服务器上指向B服务器的链接服务器,srvLinkA 是B服务器上指向A服务器的链接服务器;
sp1 是 Db1上的一个存储过程,sp2是Db2上的一个存储过程。
他在 Db1.sp1 中调用了 Db2.sp2,这从原则上讲没有什么问题。
但是他又在 Db2.sp2 中调用了 srvLinkA 查询Db1中的某个表,没错,最后发现这里就是症结所在了。
也就是他从A服务器的数据库链接B服务器,又从B服务器的数据库链接A服务器。


最后让他改改这部分,就OK了。

其实根本上来讲,愚以为这是一个设计上的错误。如果2个数据库需要实现单向链接,那么使用DBLink没有任何问题;但是如果2个数据库要双向链接,那么还是建议2个数据库放在同一个服务器下面,把链接服务器改成跨库访问,就不会有这样的问题了。

你可能感兴趣的:(SQL-Server)