簡體   English   中英

使用 PostgreSql 和 ADO.NET 在 C# WinForms 中鎖定記錄和表

[英]Record and Table locking in C# WinForms with PostgreSql and ADO.NET

我正在使用 .NET Framework 4.6.1、WinForms、PostgreSQL 6.4beta4 和 Npgsql 以及 ADO.NET。

我當前的應用程序是一個多用戶應用程序,其中所有用戶都連接到同一個數據庫。

數據通過使用 DataTable、BindingSource 和 BindingNavigator 綁定到控件。

我想避免兩個用戶可以同時編輯 DataRow。 因為我想以更通用的方法實現這一點,所以我正在考慮創建一個 DataTable 后代並添加屬性LockMode (None, Row, Table)

我發現您可以將 ColumnChanged 事件與RowState結合使用來檢測數據的變化。

我現在知道用戶是插入新值、編輯(RowState = 修改)現有值還是只是查看(RowState = Unchanged)記錄。

因此,我正在尋找一種解決方案來鎖定 DataRow 一旦用戶開始編輯它。 在應用程序中,我想在用戶導航(通過使用 Bindingnavigator 或以編程方式)到鎖定記錄后顯示一條消息。

我發現的大多數解決方案都像這樣針對 MySql Server: How to perform a row lock? TransactionScope 鎖定表和 IsolationLevel

但是我正在尋找一個 PostgreSQL 解決方案,所以即使是來自 MS ( https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx ) 的關於這個主題的文章也不能在這里使用。

如果有 PostgreSQL 和 ADO.NET 經驗的人可以幫助我,我將不勝感激。 謝謝。

您必須同步您的客戶才能實現這一目標。

我會添加一個額外的可為空的日期列 ( RowIsBeeingEdited ),指示該行開始被編輯的時間。 我會將行設置為可編輯/不可在客戶端應用程序上從行 [ RowIsBeeingEdited ] 值開始。

我還將實現兩個信號:{ UserStartedEditingRow } & { UserFinishedEditingRow },這將傳播到所有客戶端,表明客戶端 X 開始/完成了編輯行 Y。

在開始編輯行時,我會設置 row[ RowIsBeeingEdited ] = {now}並發送 { UserStartedEditingRow } 信號。 在結束編輯時,我會設置 row[RowIsBeeingEdited] = null並發送 { UserFinishedEditingRow } 信號。 當前活動的客戶端應該接收兩個信號並設置行可編輯/不可。

希望有一定的價值。

@lokusking 提供的建議聽起來不錯。 易於維護和擴展能力。

您應該在表中添加一個 RowVersion 或 Timestamp 類型的列,並將其用作更新語句中的並發標記,並在提交用戶更改之前更改值時拋出並發異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM