1

首先很抱歉我的英语不好,但我会尽力而为。

现在我正在编写一个使用 Access 2007 作为数据存储的 .net 应用程序。

简而言之:我有两个线程。一个线程将带有事务的行插入到表中。另一个线程以恒定的时间间隔更新许多行。

线程 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="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

Not sure if this will help but this article may help explain how to handle the fact that the "Microsoft Jet database engine has a read cache and lazy writes":

How To Implement Multiuser Custom Counters in Jet

于 2008-12-17T13:50:52.833 回答
0

在这种情况下使用 MARS(多个活动结果集)。在网上搜索如何实现 MARS。

于 2008-12-17T13:40:24.977 回答