Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在SQL Server 2005中,同时在同一数据库中插入来自多台计算机的记录时出现问题_Asp.net_Sql Server_Vb.net - Fatal编程技术网

Asp.net 在SQL Server 2005中,同时在同一数据库中插入来自多台计算机的记录时出现问题

Asp.net 在SQL Server 2005中,同时在同一数据库中插入来自多台计算机的记录时出现问题,asp.net,sql-server,vb.net,Asp.net,Sql Server,Vb.net,我有一个用ASP.NET设计的门户网站,我们要求客户输入数据。单击submit按钮,我所做的只是读取数据并调用一个存储过程,该存储过程将数据插入表中。SQL Server 2005在同时插入来自多台计算机的数据时似乎存在问题。我们在实验室用三台计算机进行了测试,结果是我们只在一台机器上成功地插入了数据,而在另外两台机器上,我们在页面上出现了错误 我在存储过程中使用了事务,并尝试将隔离级别设置为READ_UNCOMMITTED、SERIALIZABLE和SNAPSHOT。似乎没有什么能正常工作。我

我有一个用ASP.NET设计的门户网站,我们要求客户输入数据。单击submit按钮,我所做的只是读取数据并调用一个存储过程,该存储过程将数据插入表中。SQL Server 2005在同时插入来自多台计算机的数据时似乎存在问题。我们在实验室用三台计算机进行了测试,结果是我们只在一台机器上成功地插入了数据,而在另外两台机器上,我们在页面上出现了错误

我在存储过程中使用了事务,并尝试将隔离级别设置为READ_UNCOMMITTED、SERIALIZABLE和SNAPSHOT。似乎没有什么能正常工作。我对过去的一天感到沮丧。非常感谢您的帮助

谢谢,
Manoj

< P>你可能想考虑死锁。当多个用户同时使用存储过程时,通常会发生这种情况。为了避免死锁并确保用户的每个查询都会成功,您需要在更新失败期间进行一些处理,要做到这一点,您需要一个try-catch。这仅适用于Sql Server 20052008

DECLARE @Tries tinyint

SET @Tries = 1

WHILE @Tries <= 3

BEGIN

  BEGIN TRANSACTION

  BEGIN TRY

  -- do your insert statement here

   COMMIT

   BREAK
  END TRY

  BEGIN CATCH

   SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() as ErrorMessage

   ROLLBACK

   SET @Tries = @Tries + 1

   CONTINUE

 END CATCH

END
DECLARE@tryint
设置@trys=1

虽然@trys我认为这是因为您正在使用事务处理

根据

开始事务启动本地事务 发送连接的事务 声明。取决于 当前事务隔离级别 设置,获取许多资源以 支持Transact-SQL语句 由连接发出的消息被锁定 直到交易完成为止 使用提交事务或 回滚事务语句。 长期未完成的交易 一段时间可以防止其他问题 用户无法访问这些已锁定的文件 资源,也可以防止日志 截断

在您的案例中,您同时使用3pc测试了您的应用程序。由于您正在使用事务,如果这些用户同时在您的数据库(SP、表等)中使用相同的资源,则该特定资源将被锁定,其他用户将无法使用它 除非第一个用户的事务已完成或提交

以下是我发现的一篇好文章:
标记为应答的应答说明了死锁。虽然,并没有提供足够的信息来假设这一点,所以它可能只是阻塞了等待问题

您看到了哪个错误:

  • 1)
    死锁受害者1205错误
    “服务器:Msg 1205,第13级,状态50,第1行
    事务(进程ID 5?)在另一个进程的锁资源上被死锁,并被选为死锁受害者。请重新运行该事务。“
  • 2)
    超时错误
    “超时已过期。操作完成前超时时间已过,或者服务器没有响应。”
由于主题启动者写道:“但是表只是在5到6分钟后锁定和释放”,我认为这是2)的时间段,而死锁受害者1)被选中并在5秒内回滚

此外,有人提到,插件来自不同的计算机。事务性COM+组件运行的查询将默认为serializable tx iso级别,该级别排除死锁,但增加阻塞争用(等待)

“我在存储过程中使用了事务,并尝试将隔离级别设置为READ_UNCOMMITTED、SERIALIZABLE和SNAPSHOT。似乎没有任何功能正常工作”

这很可能意味着您的设计和索引不是“正确的”,但SQL Server只是使其正常工作

根据所提供的信息,给出任何建议都是猜测游戏

避免将CL-IX(聚集索引)放在DML编辑(更新、插入、删除)的列上。DML到聚集索引键列将需要对CL-IX(移动行)和所有非聚集索引进行锁定(因为非聚集索引的叶级通过CL-IX键值引用行)

您应该有一个索引表,否则整个表将在insert时被锁定(阻止),从而增加等待时间和超时

阅读(注意:这是一篇过时的文章。例如,您应该使用TOP,而不是此处建议的不推荐的ROWCOUNT)


在SQL Server 2005和更高版本中,应该考虑读取提交的快照TX ISO级别,每当使用默认读提交时,这是可能的。

运行这个过程需要多长时间?如果proc导致其他试图插入的用户超时,那么您可能需要对其进行一些认真的性能调整。任何进程都不应在5-6分钟内锁定表。

请分享错误详细信息?你有死锁吗?sp_lock2可以帮助您获取详细信息。嗨,菲罗兹,我没有获取任何错误的详细信息。我使用IE8进行测试,它只是在状态栏的页面上显示错误。我去检查一下锁2。谢谢你的邀请comment@to做一名程序员谢谢你的快速回复,我会测试并返回uHi,你的代码肯定工作得很好。但5到6分钟后,桌子就会锁定并释放。谢谢你的帮助。我正在寻找其他的解决办法,记住这一点。非常感谢:)好吧,你说得有道理。正是这种情况,可能的解决方案是什么?“我认为这是因为您使用的是事务…”“在SQL Server 2005中,当同时从多台计算机插入数据时,其他人似乎可以避免事务”?或者,你想用这样一句话表达什么?谢谢你提供的所有信息。我开悟了!。正如你所说,我得到超时错误。我不是DBA。说真的,我想考虑和DBA谈谈,然后回到美国。非常感谢:)嗯,将近一个月后,我终于找到了解决这个问题的办法。首先,我想强调的是,MSSQL服务器非常好地处理并发性。我的应用程序逻辑中有一个严重的错误。我是吉恩