2017-07-16 33 views
0

我有一个Vb.Net函数向数据库提交详细信息,假设我想阻止多个用户在同一时间继续执行此功能。第二个人只有在第一个人退出该功能后才有机会执行该功能。Vb.net - 如何防止多个用户执行一个函数,然后再实际完成上次执行

+2

数据库锁定是一个相当宽泛的主题使用它的每一个。你可能会发现灵感是像这样的文章(https://www.codeproject.com/Articles/114262/6-ways-of-doing-locking-in-NET-Pessimistic-and-opt)。 –

+0

赔率是你不需要防止在第一次。什么原因你需要这个功能? –

回答

0

您可以设置乐观并发。这个想法是让RowVersion列在修改行时自动增加它的值。当有人想要更新该行时,它指定WHERE中的额外条件,则该RowVersion必须与已知的RowVersion(之前检索到)匹配。如果多个用户尝试更新同一行,则只有一个用户可以成功。其他人会错过,你可以为他们显示警告信息。

在MSSQL中,这种情况下有timestamp类型。

enter image description here

0

创建线程安全队列,所有用户将增加它们的参数和后台进程将由一个执行与给定的参数一个函数。这种方法你不会依赖于数据库的类型或版本。

可以使用ConcurrentQueue(Of T)实施

Public Class DetailsRepository 

    Private ReadOnly _queue As ConcurrentQueue(Of Object) 
    Private _cancellationSource As CancellationTokenSource 
    Private _cancellationToken As CancellationToken 
    Private _task As Task 

    Public Sub New() 
     _queue = New ConcurrentQueue(Of Object)() 
    End Sub 

    Public Sub Submit(arguments As Object) 
     queue.Enqueue(arguments); 
    End Sub 

    Public Sub Start() 
     _cancellationSource = new CancellationTokenSource() 
     _cancellationToken = _cancellationSource.Token 
     _task = Task.Run(AddressOf ExecuteSubmits, _cancellationToken) 
    End Sub 

    Public Sub Stop() 
     _cancellationSource.Cancel() 
    End Sub 

    Private Sub ExecuteSubmits() 
     While True 
      Dim argument As Object 
      If _queue.TryDequeue(argument) Then 
       ' Execute database query with provided arguments 
      End If 
      If _cancellationToken.IsCancellationRequested Then 
       Exit While 
      End If 
     End 
    End Sub 
End Class 

在你的应用程序的入口点创建这个类的单一实例,并在您需要执行该功能

相关问题