Cet article nécessite une relecture technique. Voici comment vous pouvez aider.
La méthode transaction
de l'interface IDBDatabase
renvoie une transaction
sur laquelle on peut appeler la méthode IDBTransaction.objectStore
pour accéder aux magasins d'objets de la base de donnée.
Syntaxe
var transaction = db.transaction(storeNames, mode);
Paramètres
- storeNames
- un tableau de noms de magasins d'objets entrant dans le cadre de cette transaction. Indique seulement les magasins d'objets dont on a besoin.
Si l’on n’a besoin que d’un seul magasin d'objet, on peut simplement passer son nom. Les lignes suivantes sont équivalentes :var transaction = db.transaction(['my-store-name']); var transaction = db.transaction('my-store-name');
Pour utiliser tous les magasins d'objets de la base de donnée, on peut appeler la methodeIDBDatabase.objectStoreNames
:var transaction = db.transaction(db.objectStoreNames);
Passer un tableau vide lèvera une exception. - mode Facultatif
-
Le
mode
d’accès aux magasins d'objets
à la base de données (par defaultreadonly
):Valeur Explication readonly
permet de prendre des objets dans les magasins d'objets, de lire les index et de faire des curseurs. readwrite
Permet en plus de que l'on peut faire en readonly, d’ajouter et mettre à jour des objets dans les magasins d'objets. versionchange
Permet toute les opérations, y compris celles qui suppriment ou ajoutent des magasins d'objets
ou desindex
. Ce mode met à jour le numéro de version de la base de données, il se sert au début deIDBDatabase.setVersion
. Lestransactions
dans ce mode ne peuvent pas fonctionner en même temps que d'autres.readwriteflush
Si vous devez vous assurer de l'efficacité d'une transaction pour une raison quelconque (par exemple, vous stockez des données critiques qui ne peuvent être recalculées plus tard), vous pouvez forcer l’enregistrement complet sur disque avant de déclencher l’événement
complete
en utilisant le modereadwriteflush
(non standard) expérimental ( voirIDBDatabase.transaction
). C'est expérimental, et ne peut être utilisé que si ledom.indexedDB.experimental
pref est réglé surtrue
dansabout:config.
Depuis Firefox 40, les transactions IndexedDB diminuent en efficacité pour gagner en efficience (voir bug 1112702.) Auparavant, dans une transaction en
readwrite
l'événement complete était déclanché seulement lorsque toutes les données étaient écrites sur le disque. Maintenant l'événementcomplete
est déclenché après que l'OS ai envoyé l'ordre d'écrire les données, mais potentiellement avant qu'elles aient été écrites sur le disque. L'événementcomplete
peut ainsi se déclancher plus rapidement qu'auparavant, cependant, il existe une chance infime pour que l'ensemble de la transaction soit perdue si le système d'exploitation plante ou s'il y a une perte de courant avant que les données aient été écites sur le disque. Étant donné que ces événements catastrophiques sont rares la plupart des utilisateurs ne devraient pas avoir à s'en préoccuper davantage.Note : Pour éviter des pertes de performance, n’utilisez le modeSi on a besoin d’accéder à un magasin d'objets pour écrire ou mettre à jour des enregistrement, on utilise la sytaxe:readwrite
que si vous avez effectivement besoin d’écrire ou de mettre à jour des données sur la base.var transaction = db.transaction('monMagasin','readwrite');
Renvoie
Une transaction
.
Exceptions
InvalidStateError
- Cette
exception
est levée si la méthodeclose()
a été appelée sur cette connexion à la base de donnée. NotFoundError
- Cette
exception
est levée si un magasin d'objets indiqué dans le paramètrestoreNames
n'existe pas ou plus. TypeError
- Cette
exception
est levée si la valeur du paramètremode
n'est pas valide. InvalidAccessError
- Cette
exception
est levée si la liste passée àstoreNames
est vide
Exemple
Dans cet exemple, on ouvre simplement une connexion à la base de donnée puis une transaction sur cette connexion.
var db; // Connexion à la base de donnée var DBOpenRequest = window.indexedDB.open("toDoList", 4); DBOpenRequest.onsuccess = function(event) { note.innerHTML += '<li>Base de donnée initialisée.</li>'; // affecte la connexion à la variable db db = DBOpenRequest.result; // exécute la fonction displayData() qui affiche la liste des taches présentes dans la base de donnée displayData(); }; // ouvre une transaction en lecture/écriture prête pour l'ajout d'enregistrement. var transaction = db.transaction(["toDoList"], "readwrite"); // affiche le succès de l'ouverture de la transaction transaction.oncomplete = function(event) { note.innerHTML += '<li>Fin de transaction: les modifications sur la base de donnée sont terminées.</li>'; }; transaction.onerror = function(event) { note.innerHTML += '<li>La transaction n'a pas pu être initiée.</li>'; }; // On peut maintenant accéder au magasin d'objet var objectStore = transaction.objectStore("toDoList"); // etc.
Pour un exemple de travail complet, voir notre To-do Notifications app (view example live).
Spécification
Spécification | Statut | Commentaire |
---|---|---|
Indexed Database API La définition de 'transaction()' dans cette spécification. |
Recommendation |
Compatibilité avec les navigateurs
Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Support basique | 23webkit 24 |
10 moz 16.0 (16.0) |
10, en partie | 15 | 7.1 |
Disponible dans workers | (Oui) | 37.0 (37.0) | ? | (Oui) | ? |
Fonctionnalité | Android | Firefox Mobile (Gecko) | Firefox OS | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Support basique | 4.4 | 22.0 (22.0) | 1.0.1 | 10 | 22 | 8 |
Disponible dans workers | (Oui) | 37.0 (37.0) | (Oui) | ? | (Oui) | ? |