--- title: IDBTransaction slug: Web/API/IDBTransaction tags: - API - IDBTransaction - IndexedDB - Interface - Reference translation_of: Web/API/IDBTransaction ---
L'interface IDBTransaction
de l'API IndexedDB fournit une transaction statique asynchrone vers une base de données grâce à des attributs de gestion d'évènementns. Toutes les opérations de lecture et d'écriture de données sont effectuées au sein de transaction. Il est possible d'utiliser {{domxref("IDBDatabase")}} afin d'initier des transactions puis {{domxref("IDBTransaction")}} afin de paramétrer le mode de la transaction (c'est-à-dire s'il est en lecture seule ou en lecture/écriture) et d'accéder à un objet {{domxref("IDBObjectStore")}} pour réaliser une requête. On peut également utiliser IDBTransaction
pour interrompre une requête.
S'il vous garantir une certaine longévité (par exemple si on utilise des données critiques qui ne peuvent pas être recalculées par la suite), il est possible d'écrire le contenu de la transaction sur le disque avant la diffusion de l'évènement complete
grâce au mode expérimental non-standard readwriteflush
(cf. {{domxref("IDBDatabase.transaction")}}).
On notera qu'une transaction commence dès sa création et pas lorsque la première requête est lancée. Par exemple :
var trans1 = db.transaction("toto", "readwrite"); var trans2 = db.transaction("toto", "readwrite"); trans2.put("2", "clé"); trans1.put("1", "clé");
Une fois que le code est exécuté, le magasin d'objet contiendra la valeur "2" car la transaction est lancée après la transaction trans1
.
{{AvailableInWorkers}}
Cette interface hérite de {{domxref("EventTarget")}}.
readonly
.null
si la transaction n'est pas finie, est finie et validée correctement ou a été cloturée avec la fonction{{domxref("IDBTransaction.abort")}}.abort
qui est déclenché lorsque la transaction a été interrompue.complete
qui est déclenché lorsque la transaction se finit correctement.error
qui est déclenché lorsqu'une erreur empêche la transaction de se finir correctement.Une transaction peut s'effectuer dans l'un de ces modes :
Valeur | Description |
---|---|
"readonly" (0 dans Chrome) |
Ce mode permet de lire les données mais pas de les modifier. |
"readwrite" (1 dans Chrome) |
Ce mode permet de lire, d'écrire et de modifier les données du magasin d'objets. |
"versionchange" (2 dans Chrome) |
Ce mode permet d'effectuer toutes les opérations, y compris l'ajout ou la suppression de magasins d'objets et d'index. Ce mode doit être utilisé pour mettre à jour le numéro de version utilisé par les transactions démarées avec la méthode setVersion() de IDBDatabase . Les transactions lancées dans ce mode ne peuvent pas être lancées en même temps que d'autres transactions. Ces transactions sont parfois qualifiées comme « transactions de mise à jour ». |
Dans l'exemple qui suit, on ouvre une transaction en lecture/écriture sur la base de données et on ajoute des données dans le magasin d'objet. On notera également l'utilisation des gestionnaires d'évènements attachés à la transaction qui permettent d'indiquer la réussite ou l'échec de l'ouverture de la transaction. Pour un exemple complet, voir l'application de notifications To-do (voir également la démonstration live)
// On commence par ouvrir la base de données var DBOpenRequest = window.indexedDB.open("toDoList", 4); DBOpenRequest.onsuccess = function(event) { note.innerHTML += '<li>Initialisation de la base.</li>'; // On enregistre le résultat de l'ouverture // dans la variable db afin de l'utiliser // ensuite var db = DBOpenRequest.result; // On utilise la fonction addData() afin d'ajouter // des données à la base de données addData(); }; function addData() { // On crée un nouvel objet prêt à être inséré // dans la base de données var newItem = [ { taskTitle: "Promener le chien", hours: 19, minutes: 30, day: 24, month: "Décembre", year: 2013, notified: "no" } ]; // On ouvre une transaction en lecture/écriture // vers la base de données afin d'ajouter des // données var transaction = db.transaction(["toDoList"], "readwrite"); // On indique le succès de la transaction transaction.oncomplete = function(event) { note.innerHTML += '<li>Transaction terminée : modification finie.</li>'; }; transaction.onerror = function(event) { note.innerHTML += '<li>Transaction non-ouverte à cause d'une erreur. Les doublons ne sont pas autorisés.</li>'; }; // On crée un magasin d'objet pour la transaction var objectStore = transaction.objectStore("toDoList"); // On ajoute l'objet newItem au magasin d'objets var objectStoreRequest = objectStore.add(newItem[0]); objectStoreRequest.onsuccess = function(event) { // On indique le succès de l'ajout de l'objet // dans la base de données note.innerHTML += '<li>Un nouvel élément a été ajouté dans la base de données.</li>'; }; };
Spécification | État | Commentaires |
---|---|---|
{{SpecName('IndexedDB', '#transaction', 'IDBTransaction')}} | {{Spec2('IndexedDB')}} | Définition initiale |
Fonctionnalité | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Support simple | {{CompatChrome(23)}}{{property_prefix("webkit")}} {{CompatChrome(24)}} {{CompatChrome(38)}} (dépréciation des préfixes) {{CompatChrome(57)}} (retrait des préfixes) |
{{CompatVersionUnknown}} | 10 {{property_prefix("moz")}} {{CompatGeckoDesktop("16.0")}} |
10, partial | 15 | 7.1 |
Disponible dans les web workers | {{CompatVersionUnknown}} {{CompatChrome(38)}} (dépréciation des préfixes) {{CompatChrome(57)}} (retrait des préfixes) |
{{CompatUnknown}} | {{CompatGeckoMobile("37.0")}} | {{CompatUnknown}} | {{CompatOpera(35)}} | {{CompatUnknown}} |
objectStoreNames |
{{CompatChrome(48.0)}} | {{CompatUnknown}} | {{CompatGeckoDesktop("50.0")}} | {{CompatNo}} | {{CompatOpera(35)}} | {{CompatNo}} |
Fonctionnalité | Webview Android | Chrome pour Android | Edge | Firefox Mobile (Gecko) | Firefox OS | IE Phone | Opera Mobile | Safari Mobile | Chrome pour Android |
---|---|---|---|---|---|---|---|---|---|
Support simple | {{CompatVersionUnknown}} {{CompatChrome(38)}} (dépréciation des préfixes) {{CompatChrome(57)}} (retrait des préfixes) |
{{CompatVersionUnknown}} {{CompatChrome(38)}} (dépréciation des préfixes) {{CompatChrome(57)}} (retrait des préfixes) |
{{CompatVersionUnknown}} | {{CompatGeckoMobile("22.0")}} | 1.0.1 | 10 | 22 | 8 | {{CompatVersionUnknown}} |
Disponible dans les web workers | {{CompatVersionUnknown}} {{CompatChrome(38)}} (dépréciation des préfixes) {{CompatChrome(57)}} (retrait des préfixes) |
{{CompatVersionUnknown}} {{CompatChrome(38)}} (dépréciation des préfixes) {{CompatChrome(57)}} (retrait des préfixes) |
{{CompatUnknown}} | {{CompatGeckoMobile("37.0")}} | {{CompatVersionUnknown}} | {{CompatUnknown}} | {{CompatOperaMobile(35)}} | {{CompatUnknown}} | {{CompatVersionUnknown}} |
objectStoreNames |
{{CompatChrome(48.0)}} | {{CompatChrome(48.0)}} | {{CompatUnknown}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatOperaMobile(35)}} | {{CompatNo}} | {{CompatChrome(48.0)}} |
[1] Older versions of Chrome serialize all transactions. So even if you have only read-only transactions and no read-write transaction, your transactions are executed one at a time. Any subsequent transactions are not executed until all read-only transactions are completed. For the status, see bug 64076.
Note that as of Firefox 40, IndexedDB transactions have relaxed durability guarantees to increase performance (see {{Bug("1112702")}}.) Previously in a readwrite
transaction {{domxref("IDBTransaction.oncomplete")}} was fired only when all data was guaranteed to have been flushed to disk. In Firefox 40+ the complete
event is fired after the OS has been told to write the data but potentially before that data has actually been flushed to disk. The complete
event may thus be delivered quicker than before, however, there exists a small chance that the entire transaction will be lost if the OS crashes or there is a loss of system power before the data is flushed to disk. Since such catastrophic events are rare most consumers should not need to concern themselves further.