Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
如何避免由于软件设计不当而导致的未限制事务导致SQL Server挂起_Sql_.net_Sql Server_Transactions - Fatal编程技术网

如何避免由于软件设计不当而导致的未限制事务导致SQL Server挂起

如何避免由于软件设计不当而导致的未限制事务导致SQL Server挂起,sql,.net,sql-server,transactions,Sql,.net,Sql Server,Transactions,问题:一个.NET应用程序试图将许多记录保存到SQL Server。使用了BeginTrans,在提交之前,会向最终用户显示一条警告消息,以确认是否继续保存数据。用户只需离开电脑就可以离开 现在所有其他用户都无法访问锁定的记录。有时几乎整个系统都会受到影响。几乎所有的交易都在更新相同的记录;确认消息必须在数据更新之后和提交之前显示,以便用户可以回滚。最好的解决方案是什么 如果找不到解决方案,我可能做的最后一件事是回滚,显示确认消息,如果用户接受,我将再次保存数据,而不显示任何确认消息(我的方式不

问题:一个.NET应用程序试图将许多记录保存到SQL Server。使用了BeginTrans,在提交之前,会向最终用户显示一条警告消息,以确认是否继续保存数据。用户只需离开电脑就可以离开

现在所有其他用户都无法访问锁定的记录。有时几乎整个系统都会受到影响。几乎所有的交易都在更新相同的记录;确认消息必须在数据更新之后和提交之前显示,以便用户可以回滚。最好的解决方案是什么

如果找不到解决方案,我可能做的最后一件事是回滚,显示确认消息,如果用户接受,我将再次保存数据,而不显示任何确认消息(我的方式不正确)


我的问题是:我能做的最好的是什么?有什么想法吗?

这听起来像WinForms应用程序?听起来您还想确认用户操作的意图。只有在他们确认要保存数据后,您才能启动交易吗

理想情况下,你应该

  • 通过[确定|取消]提示用户
  • 执行数据库事务
  • 如果事务的结果是死锁(或任何其他故障),则通知用户保存操作失败
  • 换句话说,记录的更新应该是一个同步调用


    编辑:在理解了下面评论中提到的细节之后,我建议使用某种形式的服务器端任务队列,所有这些请求都需要通过该队列。客户机将向服务器提交请求,然后服务器应用程序将成为负责更新数据库中记录的软件。客户将向此应用程序发出请求,并将按照收到的顺序进行处理。我对库存跟踪软件没有太多经验,但我知道它必须绝对正确。所以这只是一个粗略的想法,我相信有更多库存跟踪经验的人会有更好的模式。建议的模式在负责更新记录的服务器上造成了一个很大的瓶颈。例如,对于像亚马逊这样的人来说,这种模式会很糟糕。

    谢谢,没错,它的winform应用程序,但不幸的是,我必须先更新,然后才能向用户显示是否继续的确认信息。该应用程序是一个库存管理,在我保存现金账单后,我需要检查项目期末余额是否为负数,在某些情况下,用户将接受并继续,他们只需要确认是否继续。因此,我无法提前知道库存中剩余的SKU,因为其他用户也会输入现金账单。听起来您需要某种类型的服务器端任务队列,该队列在应用程序的所有运行实例中共享。将编辑答案