Vb.net - 如何防止多个用户在实际完成上次执行之前执行一个函数

时间:2017-07-16 09:29:05

标签: vb.net

我有一个Vb.Net函数向数据库提交详细信息,假设我想阻止多个用户同时继续执行该功能。只有在第一个人摆脱了这个功能之后,第二个人才有机会执行这个功能。

2 个答案:

答案 0 :(得分:0)

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

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

enter image description here

答案 1 :(得分: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

在应用程序的入口点创建此类的单例实例,并在每个需要执行该函数的位置使用它

相关问题