0

悲しいことに、必要に応じてサーバー側で .dbf ファイルまたはデータベースを処理する必要があり、1 つ質問があります。.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複数のスレッドが同じ OdbcConnection を使用する場合は、独自のコードで行う必要があります。しかし、それは避けたほうがよいでしょう。接続を作成して使用し、できるだけ早く破棄します。

他のユーザー (セッション) のファイルを実際にロックすることはできません。その部分を同期するのは、Odbc プロバイダー次第です。

于 2010-09-08T21:30:21.017 に答える
1

私にとって、ここにはあいまいな点があります。ロックと言うとき、DB ロックまたはスレッド ロック ロックを指していますか?

あなたが言及している場合

  1. ディスク上のファイルをロックするある種の DB ロック -はい
  2. 依存するスレッドロック
    。同じプロセスからの -Threads からの同時アクセスの場合、はい、モニターはそのトリックを行うことができます。
    -同時実行が同じボックス上の複数のプロセスからのものである場合、Mutexが機能する可能性があります。
    -同時実行が複数の別々のサーバーからのものである場合、スレッド ロック ソリューションは機能しません。

しかし、同時アクセスを制御するエンジンのないファイルベースのデータベースでは、同時アクセスを慎重に処理する必要があります。

更新-1:

単純なsingle serverシナリオではsingle application、(モニターの構文シュガー)**no** web gardenを使用して DBF ファイルへの同時アクセスを制限するデータ アクセス レイヤーを作成できます。lockしかし、今日の小さな Web アプリケーションは、スケールアップとスケールアウトが必要なものに進化しており、ロック ソリューションもそれに合わせて進化する必要があります。

また、どのソリューションを使用するにしても、追加の負荷でアプリケーションがどれだけうまくスケーリングされるかに大きく影響することにも注意する必要があります。Sqlite のような最高のサーバーレス データベースでも、複数のスレッドからの同時アクセスを処理する必要がある場合、パフォーマンスが大幅に低下します。

于 2010-09-08T21:23:44.610 に答える
0

私は VFP のバックグラウンドを持っているので、DBF ファイルの使用に精通しています。実際には、ODBC 経由のような基本的なタイプの接続を処理する場合、一度に複数のテーブルを更新する場合 (サーバー データベースでトランザクションを使用する場合など) にのみ、データにロックを適用する必要があります。別のユーザーがロックを適用したために挿入/更新が失敗しないことを確認してください (したがって、データ変更の試行ではなく、ロックの試行が失敗します)。

于 2010-09-08T21:49:44.597 に答える