0

可悲的是,如果你愿意,我必须在服务器端处理一个 .dbf 文件或数据库,我有一个问题。由于 .dbf 在服务器端,更多用户可以访问它(读写,我使用 C# 和 OdbcConnection)。每当我进行插入/更新时,我应该使用锁吗?


我将回答我自己的问题,因为我想粘贴一段代码。我有一个简单操作的基类

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;
        }
}

我不知道这是否是最好的解决方案,但我只需要这些操作。我有点困惑如何在这里使用锁。

4

3 回答 3

2

lock当超过 1 个线程想要使用相同的 OdbcConnection 时,您应该在自己的代码中。但最好避免这种情况。创建和使用连接,然后尽快处理它们。

您不能真正为其他用户(会话)锁定文件。由 Odbc 提供程序来同步该部分。

于 2010-09-08T21:30:21.017 回答
1

对我来说,这里有些模棱两可。当您说锁定时,您指的是数据库锁定还是线程锁定锁定?

如果你指的是

  1. 某种将文件锁定在磁盘上的 DB Lock -是的
  2. 线程锁定取决于,如果
    来自同一进程的 -Threads 并发访问,那么是的,监视器可以解决问题。
    - 如果并发来自同一个盒子上的多个进程,那么Mutex可以工作。
    - 如果并发来自多个单独的服务器,则没有线程锁定解决方案将不起作用。

但是你是对的,基于文件的数据库没有引擎来控制并发访问,你需要小心处理并发访问。

更新 1:

对于一个简单single serversingle application,**no** web garden场景,您可以编写数据访问层以使用lock(监视器的语法糖)限制对 DBF 文件的并发访问。但是今天的小型 Web 应用程序发展成为需要扩展和扩展的东西,然后您的锁定解决方案需要随之发展。

您还应该知道,您所采用的任何解决方案都会影响您的应用程序在额外负载下的扩展能力。事件最好的无服务器数据库(如 Sqlite)在需要处理来自多个线程的并发访问时会遭受显着的性能影响。

于 2010-09-08T21:23:44.610 回答
0

我来自 VFP 背景,因此熟悉使用 DBF 文件。实际上,在处理诸如通过 ODBC 之类的基本类型连接时,如果您一次更新多个表(例如在服务器数据库中使用事务),或者如果您想成为确保您的插入/更新不会因为另一个用户应用了锁定而失败(因此您的锁定尝试失败而不是您的数据更改尝试)。

于 2010-09-08T21:49:44.597 回答