Access 2007 - не удалось обновить; в настоящее время заблокирован

Сначала извините за мой плохой английский, но я постараюсь.

Прямо сейчас я программирую приложение .net, используя Access 2007 в качестве хранилища данных.

В двух словах: у меня есть две темы. Один поток вставляет в таблицу строку с транзакцией. Другой поток обновляет множество строк с постоянными интервалами.

Тема 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 не делает этого сам?


person Community    schedule 17.12.2008    source источник


Ответы (3)


Стефан Грубер спросил:

Могу ли я вставить свои транзакции в какую-то очередь транзакций в Access? Почему Access не делает этого сам?

Я думаю, вы не понимаете механизм базы данных Jet. Прежде всего, пояснение: MS может использовать «MS Access» в качестве имени в своих строках подключения ODBC и OLEDB, но в этом случае вы вообще не используете Access — просто механизм базы данных Access по умолчанию, Jet.

Jet не является серверной базой данных. То есть между клиентами и файлом MDB, в котором хранятся данные, нет серверного процесса. Все «пользователи» файла MDB обращаются к нему через файловую систему. Для управления многопользовательским доступом существует файл блокировки (файл LDB), который отслеживает, какие таблицы/записи заблокированы и какие типы блокировок. Jet проверяет этот LDB-файл, чтобы определить, что он может, а что нет.

Теперь, поскольку нет процесса на уровне сервера для управления всем взаимодействием с данными на диске, нет возможности упорядочивания запросов на доступ к файлу MDB. Ваше приложение должно сделать это само.

Если это неудовлетворительно, то вы используете неправильное хранилище данных.

person David-W-Fenton    schedule 19.12.2008

В этом случае используйте MARS (несколько активных наборов результатов). Поищите в сети, как реализовать MARS.

person Samiksha    schedule 17.12.2008

Не уверен, что это поможет, но эта статья может помочь объяснить, как справиться с тем фактом, что «механизм базы данных Microsoft Jet имеет кэш чтения и ленивую запись»:

Как реализовать многопользовательские настраиваемые счетчики в Jet

person onedaywhen    schedule 17.12.2008