Pour une application que nous sommes en train de développer, nous devons lire n lignes d'une table, puis mettre à jour ces lignes de manière sélective en fonction de critères spécifiques au domaine. Pendant cette opération, tous les autres utilisateurs de la base de données doivent être verrouillés pour éviter les mauvaises lectures.SQLite Transaction non validée
Je commence une transaction, lisez les lignes, et tout en réitérant sur le recordset construire une chaîne de déclarations de mise à jour. Une fois que j'ai fini de lire le jeu d'enregistrements, je ferme le jeu d'enregistrements et exécute les mises à jour. À ce stade, je valide la transaction, mais aucune des mises à jour n'est effectuée sur la base de données.
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;
Si je supprime la transaction, tout fonctionne comme prévu. Le "Domaine stuff" est domaine specfic et autre que la lecture des valeurs du jeu d'enregistrements n'accède pas à la base de données. Ai-je oublié un pas?
Quelqu'un at-il remarqué à quel point il est étrange que ce site utilise des barres de défilement dans la page malgré la fréquence à laquelle Jeff Atwood se plaint de ce type de conception? – marr75