【问题标题】:Prevent concurrent execution of stored procedure with ADO.NET in ASP.NET防止在 ASP.NET 中使用 ADO.NET 并发执行存储过程
【发布时间】:2017-01-10 23:21:17
【问题描述】:

我想防止两个用户同时执行同一个存储过程。如果有两个 ASP.NET 请求进来执行该存储过程,那么这些请求应该以串行方式一个接一个地执行。

SQL Server 数据库和执行由 ado.net 处理。

以下任何方法都有助于实现这一目标吗?最合适的方法是什么?有没有其他方法可以达到同样的效果?

  1. 通过将隔离级别设置为可序列化,使用 ado.net 事务执行存储过程

  2. 在存储过程中使用sp_getapplock,最后释放

【问题讨论】:

    标签: c# sql-server concurrency ado.net transaction-isolation


    【解决方案1】:

    通过设置执行带有 ADP.NET 事务的存储过程 可序列化的隔离级别

    是的,您可以在您的 ADP.NET 事务中使用 Serializable 隔离级别。它是最高的隔离级别,它依赖于悲观的并发控制并通过假设两个事务可能尝试更新相同的数据并使用来确保它们不这样做来保证一致性。 一个事务必须等待另一个事务完成,它们可能会死锁。

    在存储过程中使用 sp_getapplock 并在最后释放

    是的,您可以使用 SQL Server 应用程序锁sp_getapplock。您必须使用sp_releaseapplock 释放锁

    另一种选择是使用Global Temporary Tables

    【讨论】:

    • 感谢@william 的链接。我刚刚在该链接的第一段中找到了这一行“但是,您需要执行存储过程的帐户的权限”。这是否意味着在没有 sp_getapplock 的情况下执行 SP 所需的权限对于具有 sp_getapplock 的 SP 来说可能不够?
    【解决方案2】:

    我建议在架构的中间层使用排队系统,介于 ASP.NET 和数据库之间。这样,请求就会按顺序接收和处理。然后,您可以将系统配置为一次只处理一个请求,

    【讨论】:

    • 是的,这是一个很好的设计模式。但在我的情况下,我需要将 sp 执行结果实时显示给用户。谢谢
    • 你不会通过直接连接到 sql 来获得更多的实时性 - 它仍然是一个必须进行跳跃的网络连接
    • 声音看起来不错,但不适用于“可扩展的网络应用程序”。不同的实例运行,每个实例都有自己的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多