我有一个Vb.Net函数向数据库提交详细信息,假设我想阻止多个用户同时继续执行该功能。只有在第一个人摆脱了这个功能之后,第二个人才有机会执行这个功能。
答案 0 :(得分:0)
您可以设置乐观并发。我们的想法是让RowVersion列在修改行时自动增加它的值。当有人想要更新行时,它在WHERE
中指定了额外条件,RowVersion必须与已知的RowVersion(之前检索过的)匹配。如果多个用户尝试更新同一行,则只有一个用户可以成功。其他人会错过,你可以为他们显示警告信息。
在MSSQL中,这种情况有timestamp
类型。
答案 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
在应用程序的入口点创建此类的单例实例,并在每个需要执行该函数的位置使用它