1

最初は英語が下手でごめんなさい。でも頑張ります。

現在、Access2007をデータストアとして使用して.netアプリケーションをプログラミングしています。

一言で言えば:私は2つのスレッドを持っています。1つのスレッドは、トランザクションを含む行をテーブルに挿入します。他のスレッドは、一定の間隔で多くの行を更新します。

スレッド1

Database db = _loggingDatabase;

using (DbConnection conn = db.CreateConnection())
{
    conn.Open();
    DbTransaction txn = conn.BeginTransaction();
try
{
    string qryInsert = "Insert this";
    DbCommand cmdIns = db.GetSqlStringCommand(qryInsert);
    db.ExecuteNonQuery(cmdIns, txn);
    txn.Commit();
}
catch (Exception ex)
{
    txn.Rollback();
    throw ex;
}
finally
{
    conn.Close();
}

スレッド2

 Database db = _loggingDatabase;

    using (DbConnection conn = db.CreateConnection())
    {
        conn.Open();
        DbTransaction txn = conn.BeginTransaction();
    try
    {
        string qryUpdate = "Update that";
        DbCommand cmdUpdt = db.GetSqlStringCommand(qryUpdate);
        db.ExecuteNonQuery(cmdUpdt, txn);
        txn.Commit();
    }
    catch (Exception ex)
    {
        txn.Rollback();
        throw ex;
    }
    finally
    {
        conn.Close();
    }

多くのレコードを挿入するようにトリガーすると、「更新できませんでした。現在ロックされています」というSystem.Data.OleDb.OleDbExceptionが発生します。Connectionstringをに変更しようとしました

connectionString="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=datastore.accdb; Jet OLEDB:Database Locking Mode=1;"

アプリケーションの動作には影響しません。混沌とした挿入と更新を避けるために、これらのトランザクションを使用することを説明しました。

回避策はありますか?私は何が間違っているのですか?ある種のトランザクションキューへのトランザクションをAccessに挿入できますか?Accessが単独でこれを行わないのはなぜですか?

4

3 に答える 3

2

シュテファン・グルーバーは次のように尋ねました。

ある種のトランザクション キューに自分のトランザクションを Access に挿入できますか? Access が単独でこれを実行しないのはなぜですか?

あなたは Jet データベース エンジンを理解していないと思います。まず、明確化: MS は、ODBC および OLEDB 接続文字列の名前として「MS Access」を使用する場合がありますが、その場合、Access をまったく使用していません。Access の既定のデータベース エンジンである Jet だけです。

Jet はサーバー データベース エンジンではありません。つまり、クライアントと、データが格納されている MDB ファイルとの間にサーバー プロセスは存在しません。MDB ファイルのすべての「ユーザー」は、ファイル システムを介してアクセスしています。マルチユーザー アクセスを管理するために、ロックされているテーブル/レコードとロックの種類を追跡するロック ファイル (LDB ファイル) があります。Jet はその LDB ファイルをチェックして、できることとできないことを判断します。

現在、ディスク上のデータとのすべてのやり取りを管理するサーバー レベルのプロセスがないため、MDB ファイルへのアクセス要求がマーシャリングされる可能性はありません。アプリ自体がそれを行う必要があります。

これで満足できない場合は、間違ったデータ ストアを使用しています。

于 2008-12-19T02:32:42.233 に答える
0

この場合、MARS(Multiple Active Resultsets)を使用します。MARSの実装方法についてはネットで検索してください。

于 2008-12-17T13:40:24.977 に答える
0

これが役立つかどうかはわかりませんが、この記事は、「MicrosoftJetデータベースエンジンに読み取りキャッシュと遅延書き込みがある」という事実を処理する方法を説明するのに役立つ場合があります。

Jetでマルチユーザーカスタムカウンターを実装する方法

于 2008-12-17T13:50:52.833 に答える