Сначала извините за мой плохой английский, но я постараюсь.
Прямо сейчас я программирую приложение .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 не делает этого сам?