事务提交已成功执行但未完成

时间:2009-06-28 15:54:47

标签: c# sql-server-2005 ado.net transactions

我在Sql Server中遇到了一个奇怪的问题。 我有一个Pocket PC应用程序连接到Web服务,而Web服务又连接到数据库并插入大量数据。 Web服务为连接到它的每个Pocket PC打开一个事务。每天中午12点,15到20人使用不同的掌上电脑同时连接到Web服务并成功完成传输。 但在那之后,仍有一个与4000个独占锁相关联的打开事务(在Activity Monitor中可见)。几个小时后,它们会消失(可能会超时)并删除一些转移的数据。有没有办法阻止这些锁定的发生?或者以编程方式识别它们并等待解锁?

非常感谢。

5 个答案:

答案 0 :(得分:2)

你可以运行sp_lock并检查你感兴趣的表上是否有任何独占锁。这将告诉你违规连接的SPID,你可以使用sp_whosp_who2以查找有关该SPID的更多信息。

或者,Management Studio中的活动监视器将为您提供此信息的图形版本,并且还允许您终止任何有问题的进程(kill命令将允许您在查询编辑器中执行相同操作)

答案 1 :(得分:1)

您可以使用SQL Server Profiler来监控发生的陈述,包括交易的开始和结束。 Microsoft支持中还有一些工具很棒,因为它们运行分析器和阻塞脚本。我想看看如果我做/.

我是否能找到这些会更新

如果您有一个打开的事务,您应该能够在活动监视器中看到这个,这样您就可以在重新启动服务器之前检查是否有任何打开的事务。

修改

听起来这个问题几乎每天都在同一时间发生。您需要在问题发生之前将其打开。

答案 2 :(得分:0)

我怀疑你在代码中做错了什么,你是否将命令超时设置为足够大的值来完成他们的工作,或者可能是错误正在跳过COMMIT?

您可以通过运行来检查打开的交易:

DBCC OPENTRAN

答案 3 :(得分:0)

select上的超时表示事务仍处于打开状态,并且锁定了表的至少一部分。

您是如何通过网络服务进行交易的?您在代码中如何/在何处提交交易?

答案 4 :(得分:0)

做了很多测试,我发现了一个僵局正在发生。但我找不到原因,因为我只是在一些独立的表中插入了这么多记录。 这些链接有点帮助,但没有运气:

http://support.microsoft.com/kb/323630

http://support.microsoft.com/kb/162361

我甚至将我的交易分成了较小的交易,但我仍然遇到了僵局。我最终删除了事务,并将代码更改为不从源数据库中删除它们,并且不再出现死锁。

作为一个教训,现在我知道如果你有一些(多个)大型事务同时在同一个数据库上执行,你肯定会在SQL Server中遇到问题,我不知道Oracle。