奇怪的SQL2005问题。"SqlConnection不支持并行事务"。

3
我有一个问题,看起来像是死锁的结果。我们正在寻找问题的根源,但同时我们想重新启动服务器并让客户继续使用。
现在每次启动程序时,它都会显示“SqlConnection不支持并行事务”。我们没有改变程序中的任何内容,它已经编译并在客户服务器上运行,但在“可能的死锁”情况之后,它无法再次联机。
我们有7个客户端(计算机)运行该程序,每个客户端都与本地服务器上的Web服务进行通信,而Web服务则与SQL服务器进行通信(与Web服务器相同的机器)。
我们已经重新启动了SQL服务器和IIS服务器,但由于其他重要服务正在服务器上运行,所以我们没有重新启动服务器,这是我们最后要做的事情。我们在管理选项卡中看不到任何锁或其他东西。
因此,我的问题是,为什么“SqlConnection不支持并行事务”错误会突然出现,而程序中没有更改任何内容,并且它仍然存在于SQL重新启动之间。
似乎它发生在程序启动时进行的第一个数据库请求。
如果您需要更多信息,请询问。我很困惑...
更多信息: 我认为我没有“长时间”运行的事务。场景通常是我有一个包含20-100行(ContractRows)的数据集,在该数据集上我会对tableAdapter进行更新。我还会遍历这些20-100行,并为其中的一些创建ad-hook-sql查询(例如,如果已租用的产品被标记为已退回,则在数据库中创建一个sql查询来将该产品标记为已退回)
所以我非常简化地做到了这一点:
Create objTransactionObject
Create objtableadapter (objTransactionObject)
for each row in contractDS.contractrows
  if row.isreturned then
    strSQL &= "update product set instock=1 where prodid=" & row.productid & vbcrlf
 End if
next
objtableadapter.update(contractDS)
objData.ExecuteQuery(strSQL, objTransactionObject)    
if succsesfull 
  objtransactionobject.commit
else
  objtransactionobject.rollback
end if
objTran.Dispose()

接着,根据操作结果进行提交或回滚。

编辑:没有一个答案解决了问题,但感谢你们提供的良好故障排除指针。

“SqlConnection不支持并行事务”突然消失了,现在SQL服务器每天会“崩溃”4-5次,我想这可能是死锁引起的,但我没有足够的知识来找出原因,也缺少可以监视此问题的SQL专家。我只能重启SQL服务器,然后一切都正常了。有时候我还必须重启计算机。这真的很让我困扰(当然也让我的客户困扰)。

任何在瑞典(或全球任何英语国家)了解分析死锁或其他SQL问题知识渊博的人都可以联系我。我知道这不是联系网站,但我想抓住机会问这个问题,因为我已经没有其他选择了,我已经花了三天三夜优化客户端,以确保我们关闭连接并且不做太多愚蠢的事情,但没有成功。


请原谅我的无知 - 我是一名Java程序员 - 但看起来你会将每个SQL语句连接在一起,用CRLF分隔,然后执行它们。对吗?在Java中,我会将更新批处理在一起。连接会发生什么情况?何时关闭? - duffymo
我在我的简化示例中添加了commot/rollback/dispose。 objData.ExecuteQuery是一个执行SQL命令的函数。 - Stefan
4个回答

7

看起来你正在共享连接并在同一个打开的连接上创建新事务(这是你看到的异常的并行部分)。

你的示例似乎支持这一点,因为它没有提到如何获取连接。

您应该检查代码并确保只在需要时打开连接,然后将其处理掉(并且务必使用using语句来确保关闭连接),因为似乎您在某个地方将连接保持打开状态。


发现两个客户端共享同一个连接,在某些罕见情况下会在该连接上启动事务。 - Stefan

2

你的问题似乎并不罕见。当我将你的错误字符串粘贴到查询框中时,谷歌找到了很多相关结果。

从以前的答案中看来,这似乎与事务交错不当或隔离级别有关。

连接保持多长时间?你是否有长时间运行的事务?


谢谢,我将在事务的隔离级别上进行实验,看看它能得到什么结果。 - Stefan

2
你是否在某个地方开启了隐式事务,导致出现了一些意料之外的事务?你是否打开了活动监视器,查看是否有任何意外的事务?

谢谢,我会检查一下是否是这种情况。我可以看到我的SPID在使用后等待或休眠很长时间,但我猜这是某种连接池机制。 - Stefan

0

你尝试过备份事务日志吗?如果我记得正确的话,这也可能会清除它。


我还没有。明天我会尝试并在这里报告结果。 谢谢。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接