Для приложения, которое мы разрабатываем, нам нужно прочитать n строк из таблицы, а затем выборочно обновить эти строки на основе критериев, специфичных для домена. Во время этой операции все остальные пользователи базы данных должны быть заблокированы, чтобы избежать плохого чтения.
Я начинаю транзакцию, читаю строки и, пока перебираю набор записей, создаю строку операторов обновления. После завершения чтения набора записей я закрываю набор записей и запускаю обновления. На этом этапе я фиксирую транзакцию, однако в базе данных не выполняется ни одного обновления.
private static SQLiteConnection OpenNewConnection()
{
try
{
SQLiteConnection conn = new SQLiteConnection();
conn.ConnectionString = ConnectionString;//System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
conn.Open();
return conn;
}
catch (SQLiteException e)
{
LogEvent("Exception raised when opening connection to [" + ConnectionString + "]. Exception Message " + e.Message);
throw e;
}
}
SQLiteConnection conn = OpenNewConnection();
SQLiteCommand command = new SQLiteCommand(conn);
SQLiteTransaction transaction = conn.BeginTransaction();
// Also fails transaction = conn.BeginTransaction();
transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);
command.CommandType = CommandType.Text;
command.Transaction = transaction;
command.Connection = conn;
try
{
string sql = "select * From X Where Y;";
command.CommandText = sql;
SQLiteDataReader ranges;
ranges = command.ExecuteReader();
sql = string.Empty;
ArrayList ret = new ArrayList();
while (MemberVariable > 0 && ranges.Read())
{
// Domain stuff
sql += "Update X Set Z = 'foo' Where Y;";
}
ranges.Close();
command.CommandText = sql;
command.ExecuteNonQuery();
// UPDATES NOT BEING APPLIED
transaction.Commit();
return ret;
}
catch (Exception ex)
{
transaction.Rollback();
throw;
}
finally
{
transaction.Dispose();
command.Dispose();
conn.Close();
}
return null;
Если я удалю транзакцию, все будет работать как положено. «Материал домена» специфичен для домена и, кроме чтения значений из набора записей, не обращается к базе данных. Я забыл шаг?