2010-09-08 66 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处理基本类型连接时,如果您一次更新多个表(如在服务器数据库中使用事务),或者如果您希望成为确保你的插入/更新不会失败,因为另一个用户已经应用了一个锁(所以你的锁试图失败,而不是你的数据更改尝试)。

相关问题