Define el alcance en las transacciones de IndexedDB

¿Qué es IndexedDB?

IndexedDB es un estándar web en evolución para el almacenamiento de grandes cantidades de datos estructurados en el navegador y para realizar búsquedas de alto rendimiento en estos datos con índices. En otras palabras, IndexedDB es un almacén de objetos. No es lo mismo que una base de datos relacional, que tiene tablas con filas y columnas de colecciones. Es una diferencia importante y fundamental que afecta la forma en que diseñas y compilas tus aplicaciones (obtén más información en los conceptos básicos).

¿Cuáles son las novedades?

Cambios, amigos míos… Tenemos algunos cambios que arrojarán algunos errores si no los manejamos con un cambio de sintaxis simple.

A partir de la versión 17, Chrome mostrará un error si una transacción de IndexedDB no está centrada en un almacén de objetos. Dado que todas las operaciones de lectura y escritura de datos se realizan dentro de las transacciones, debemos crear una transacción en una base de datos, especificar el alcance (como a qué almacenes de objetos deseas acceder) y determinar el tipo de acceso (solo lectura o escritura).

¿Qué significa en el código? En lugar de pasar un array vacío a nuestra database.transaction, haz lo siguiente:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

Debes definir el alcance para un almacén de objetos en particular o una lista de almacenes de objetos:

// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);

// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
    IDBTransaction.READ_ONLY);

// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);

Puedes acelerar el acceso a los datos si usas el alcance y el modo correctos en la transacción. A continuación, se incluyen algunas sugerencias: Cuando definas el alcance, especifica solo las tiendas de objetos que necesitas. De esta manera, puedes ejecutar varias transacciones con permisos no superpuestos de forma simultánea. Solo especifica un modo de transacción READ_WRITE cuando sea necesario. Puedes ejecutar varias transacciones READ_ONLY de forma simultánea con alcances superpuestos, pero solo puedes tener una transacción READ_WRITE para un almacén de objetos.

Otras fuentes:

Hasta la próxima, sigue impulsando la Web a territorios cercanos.