Для приложения, которое мы разрабатываем, нам нужно прочитать 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;
Если я удалю транзакцию, все будет работать как положено. «Материал домена» зависит от домена и, кроме чтения значений из набора записей, не имеет доступа к базе данных. Я забыл шаг?