防止在Asp.net中使用ado.net并发执行SQL Server存储过程

我想阻止两个用户同时执行相同的存储过程。 如果两个asp.net请求进入执行该存储过程,那么这些请求应该以串行方式一个接一个地执行。

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

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

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

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

通过将隔离级别设置为Serializable,使用ado.net事务执行存储过程

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

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

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

另一种选择是使用全局临时表 。

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