AIR SQLite – Utilisation des transactions (begin / commit / rollback) en synchrone
Les transactions SQL sont utiles quand on veut faire plusieurs modifications dans les données et s'assurer que les données restent cohérentes.
Avec une transaction, soit toutes les modifications sont effectuée, soit aucune. Cela permet d'être sûr qu'il n'y a jamais une partie seulement du traitement qui a été fait. Les transactions SQL vous permettent d'assurer l'intégrité des données.
On démarre une transaction avec une instruction "begin. Pour terminer la transaction en la validant, on fait un "commit". Cela va écrire toutes les modifications effectuées depuis le "begin" dans la base. Pour terminer une transaction en l'annulant, on fait un "rollback" toutes les modifications de données depuis le "begin" sont annulées.
Une très bonne explication est données dans cet article:
Les transactions Par Henry Cesbron Lavau
Au delà de ces aspects d'intégrité, les transactions apportent aussi un gain non négligeable lorsque l'on effectue de gros traitements sur une base. Par exemple si vous effectuez l'insertion de centaines d'enregistrements, vous devrez utiliser des transactions, sans quoi le traitement se fera de manière lente.
Transaction SQL en mode synchrone
Pour commencer, on va tout d'abord voir comment exécuter des transitions en mode synchrone, ce mode étant beaucoup plus facile à mettre en place que de l'asynchrone. En effet, en mode synchrone, le traitement est séquentiel, la logique est ainsi plus simple.
Voici un exemple d'application complet qui crée une table "employees" et insère plusieurs enregistrements provenant d'objet Contact (ici, en dur):
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
horizontalAlign="left" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
// -- IMPORTS ---------------------------------------------------------------- /
import vo.Contact;
// -- PROPERTIES ------------------------------------------------------------- /
private var conn:SQLConnection;
private var _contacts:Array = [new Contact(0, "A", "A", "A", "a@gmail.com", "M"), new Contact(1,
"B", "B", "B", "b@gmail.com", "M"), new Contact(2, "C", "C", "C", "c@gmail.com", "F"), new Contact(3,
"D", "D", "D", "d@gmail.com", "M"), new Contact(4, "E", "E", "E", "e@gmail.com", "F"), new Contact(5,
"F", "F", "F", "f@gmail.com", "M"), new Contact(6, "G", "G", "G", "g@gmail.com", "F")];
// -- AUTO INIT FUNCTIONS --------------------------------------------------- /
private function clickConnect():void {
conn = new SQLConnection();
var dbFile:File = File.applicationDirectory.resolvePath("employees.db");
try {
connLabel.text = "Database Status: Connected";
conn.open(dbFile);
// votre BDD est accessible ici
connectButton.enabled = false;
var createStmt:SQLStatement = new SQLStatement();
createStmt.sqlConnection = conn;
var sql:String = "CREATE TABLE IF NOT EXISTS employees (id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" firstName TEXT, lastName TEXT, middleInitial TEXT, email TEXT, gender TEXT)";
createStmt.text = sql;
createStmt.execute();
} catch (error:SQLError) {
trace("Error message:", error.message);
trace("Details:", error.details);
connLabel.text = "Database Status: Not Connected";
connectButton.enabled = true;
}
}
private function callQuery(event:Event):void {
try {
// on commence la transaction
conn.begin();
var q:SQLStatement = new SQLStatement();
q.sqlConnection = conn;
var sql:String = "INSERT INTO employees (firstName, lastName, middleInitial, email, gender)" +
"VALUES (:firstName, :lastName, :middleInitial, :email, :gender)";
q.text = sql;
for each (var contact:Contact in _contacts) {
q.clearParameters();
q.parameters[":firstName"] = contact.firstName;
q.parameters[":lastName"] = contact.lastName;
q.parameters[":middleInitial"] = contact.middleInitial;
q.parameters[":email"] = contact.email;
q.parameters[":gender"] = contact.gender;
q.execute();
}
// on valide la transaction
conn.commit();
} catch (error:SQLError) {
// on annule la transaction entière
conn.rollback();
trace("Error message:", error.message);
trace("Details:", error.details);
}
}
]]>
</mx:Script>
<mx:Label text="SQLite Example" fontSize="18" fontWeight="bold" />
<mx:Label id="connLabel" text="Database Status: Not Connected" />
<mx:HBox>
<mx:Button id="connectButton" click="clickConnect()" label="Connect" enabled="true" />
<mx:Button id="queryButton" click="callQuery(event)" label="Insert" enabled="true" />
</mx:HBox>
</mx:WindowedApplication>
Télécharger le code source au format FXP
Cela donne aussi un exemple de requête SQL paramétrées comme on a pu le voir dans le tutorial précédent:
AIR SQLite – Utilisation de requête paramétrée (SQLStatement parameters)
En effet, le couple requêtes SQL paramétrées / transaction vous permettra d'avoir les meilleures performances lorsque vous réaliser des opérations (INSERT, UPDATE, ..) lourdes.
Articles similaires
- AIR SQLite – Utilisation des transactions (begin / commit / rollback) en asynchrone
- AIR SQLite – Utilisation de Responder en mode asynchrone
- AIR SQLite – Embarquer une base SQLite pré-remplie dans une application AIR
- AIR SQLite – Enregistrer des objets ActionScript dans une base SQLite
- AIR SQLite – Création de tables SQLite et types de données





