2017-07-16 64 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 

在你的應用程序的入口點創建這個類的單一實例,並在您需要執行該功能

相關問題