2010-09-08 65 views
0

不幸的是,如果需要,我必須在服務器端處理.dbf文件或數據庫,並且我有一個問題。 由於.dbf位於服務器端,所以更多的用戶可以訪問它(讀取和寫入,我使用C#和OdbcConnection)。我應該在每次插入/更新時使用鎖定嗎?更多用戶可以寫入.dbf數據庫文件時使用鎖定嗎?


我會回答我自己的問題,因爲我想粘貼一段代碼。 我有一個基類簡單的操作

void ExecuteNonQuery(string sqlStatement) 
T ExecuteScalar<T>(string sqlStatement) 
List<T> GetDataTable<T>(string sqlStatement) where T:new() 

public class BaseService 
{ 
     protected void ExecuteNonQuery(string sqlStatement) 
     { 
      using (OdbcConnection odbconn = new OdbcConnection(ConnectionString)) 
      { 
       odbconn.Open(); 
       OdbcCommand cmd = new OdbcCommand(sqlStatement, odbconn); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
} 

public class UsersService : BaseService 
{ 
     public void SomeInsert() 
     { 
      string insertUserString = "Insert Into...."; 
      ExecuteNonQuery(insertUserString); 
      return true; 
     } 
} 

我不;噸知道,如果它的最佳解決方案,但這些操作都是我需要的。我有點困惑如何在這裏使用鎖。

回答

1

對我而言,這裏有一些含糊之處。當你說鎖是指數據庫鎖或線程鎖定鎖?

如果您reffering到

  1. 某種類型的數據庫鎖用於鎖定磁盤上的文件 -
  2. 螺紋鎖固依賴,如果從
    -threads來自同一併發訪問過程然後是Monitor可以做到這一點。
    - 如果併發來自同一個盒子上的多個進程,那麼Mutex可以工作。
    - 如果併發來自多個獨立的服務器,則無線程鎖定解決方案將無法工作。

但你是正確的,與基於文件的數據庫,沒有引擎控制併發訪問,你需要認真處理的併發訪問。

更新-1:

一個簡單的single serversingle application**no** web garden情況下,你可以寫你的數據訪問層來限制使用lock(用於監視器語法糖)DBF文件的併發訪問。但是今天的小型Web應用程序已經演變成需要擴展和擴展的東西,然後您的鎖定解決方案需要隨之發展。

您還應該意識到,您的任何解決方案都會影響您的應用程序在額外負載下的擴展程度。事件像Sqlite這樣的最好的無服務器數據庫在需要處理來自多線程的併發訪問時遭受重大性能影響。

+0

那麼,要清楚它是關於一個asp.net應用程序,用戶可以讀取/寫入.dbf數據庫文件。我應該怎麼做,以便不超過1個用戶可以在同一時間寫入 – jane 2010-09-08 21:25:40

+0

@jane:沒有任何結果。請閱讀反問題。 – 2010-09-08 21:26:43

+0

@jane,請參閱更新。我試圖在那裏處理你的評論。 – 2010-09-08 21:37:14

2

如果多個線程想要使用相同的OdbcConnection,則應該在您自己的代碼中使用lock。但最好避免這種情況。創建並使用連接,然後儘快處理它們。

您無法真正鎖定其他用戶(會話)的文件。由Odbc提供者來同步該部分。

+0

沒有更多線程使用相同的OdbcConnection。我使用(在這裏使用OdbcConnection執行一些查詢),這是一個沒有靜態的類。這樣可以嗎? – jane 2010-09-08 21:33:03

+0

是的,使用聲音OK。 – 2010-09-08 21:50:09

0

我來自VFP背景,所以我很熟悉使用DBF文件。實際上,當通過ODBC處理基本類型連接時,如果您一次更新多個表(如在服務器數據庫中使用事務),或者如果您希望成爲確保你的插入/更新不會失敗,因爲另一個用戶已經應用了一個鎖(所以你的鎖試圖失敗,而不是你的數據更改嘗試)。

相關問題