Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

19fév/110

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