C# 事务提交成功执行,但未完成

C# 事务提交成功执行,但未完成,c#,sql-server-2005,ado.net,transactions,C#,Sql Server 2005,Ado.net,Transactions,我在Sql Server中遇到了一个奇怪的问题。 我有一个连接到web服务的pocket PC应用程序,web服务又连接到数据库并插入大量数据。web服务为每个连接到它的pocket PC打开一个事务。每天下午12点,15到20个人使用不同的pocket PC同时连接到web服务并成功完成传输。 但在此之后,仍有一个与4000个独占锁关联的打开事务(在活动监视器中可见)。几个小时后,它们消失(可能是某个时间超时),一些传输的数据被删除。有什么方法可以防止这些锁发生吗?或者通过编程识别它们并等待解

我在Sql Server中遇到了一个奇怪的问题。 我有一个连接到web服务的pocket PC应用程序,web服务又连接到数据库并插入大量数据。web服务为每个连接到它的pocket PC打开一个事务。每天下午12点,15到20个人使用不同的pocket PC同时连接到web服务并成功完成传输。 但在此之后,仍有一个与4000个独占锁关联的打开事务(在活动监视器中可见)。几个小时后,它们消失(可能是某个时间超时),一些传输的数据被删除。有什么方法可以防止这些锁发生吗?或者通过编程识别它们并等待解锁

非常感谢。

您可以使用它监视正在发生的语句,包括事务的开始和结束。还有一些来自Microsoft Support的工具非常棒,因为它们运行探查器和阻止脚本。我想看看我是否能找到这些将更新,如果我这样做/

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

编辑


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

我怀疑您在代码中做错了什么,您是否将命令超时设置为足够大的值以执行其工作,或者可能是跳过提交时出错

您可以通过运行以下命令来检查打开的事务:

DBCC OPENTRAN

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


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

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


您如何通过web服务进行事务处理?在代码中,您是如何/在何处提交事务的?

通过大量测试,我发现出现了死锁。但我找不到原因,因为我只是在一些独立的表中插入了这么多记录。 这些链接有点帮助,但运气不好:

我甚至把我的交易分成了更小的交易,但我还是陷入了僵局。最后,我删除了事务,并更改了代码,使其不再从源数据库中删除,并且不再出现死锁


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

谢谢。我不得不等到它再次发生——现在。如活动监视器所示,有一个与流程关联的开放事务。使用sp_锁,我看到这个SPID大约有7000个锁。这不正常吗?如果是这样,我该如何预防?或者是否有一种方法可以提交此事务?因为杀了它不是解决我问题的选择。再次感谢。锁的数量相当多!您需要注意的是专用锁,标记为X,因为它们会阻止对底层资源的所有访问。(IX,intent locks,阻止其他人在父对象上获得锁;如果此进程在一行上具有X锁,则包含该行的页面和表将被IX锁定)。至于贪婪进程,请查看sp_who2以了解它的连接来源以及应用程序是什么。这应该有助于调试。然后,您可以使用其他技术(如SQL Profiler)来微调调试。其中72个是IX,所有其他都是X。正如sp_who2所示,它来自我的web服务用户,并且它表示状态为“睡眠”。我上一次调试了我的代码,我确信没有例外。在执行每一次插入后,我是否可以/应该以编程方式检查任何信息?我能否以任何方式配置事务以避免这些锁定?1)您可以检查的信息:如果愿意,您可以在每次操作后读取@@trancount变量以获取调试信息。2) 您可以配置一个不同的事务隔离级别,它不支持锁,但是相信我,您不想在这里这样做!1) @@TRANCOUNT即使现在也返回0。你的意思是如果它大于0,我应该等待?我担心这会使我的网络服务超时。2) 我不是有意忽略锁,我问是否有办法防止它们发生。谢谢。但在事务开始后开始跟踪时,探查器不会显示任何活动。我今天早上开始跟踪,我正在浏览一些奇怪的东西,或者关于锁的东西。你知道我应该检查什么吗?我没有更改命令超时,而且我确信提交已执行(因为我有3个事务同时提交,一个在MySql中,一个在SqlServer中,另一个在SqlCE中;另外两个事务已提交,我可以看到数据)。DBCCOpenTran在提交后显示一个打开的事务。我只是不知道现在该怎么做才能让它被提交。你能把你的代码缩减到可以发布到这里吗?//所有方法都是由webservice调用的,它是从SqlCE事务公共数据服务()中的设备项目调用的。{mySqlService=new mySqlService();connection=new SqlConnection(connectionString);connection.Open();transaction=connection.BeginTransaction();}…//传输数据的方法-它们使用事务公共void Commit(){transaction.Commit();mySqlService.Commit();connect