Access 2007 - «Не удалось обновить; в данный момент заблокировано» - PullRequest
1 голос
/ 17 декабря 2008

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

Сейчас я программирую приложение .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 этого не делает itselft?

Ответы [ 3 ]

2 голосов
/ 19 декабря 2008

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

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

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

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

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

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

0 голосов
/ 17 декабря 2008

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

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

0 голосов
/ 17 декабря 2008

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

...