IDB transaction aborting
by Brian Birtles
HTML
<script src="https://unpkg.com/[email protected]/build/iife/index-min.js"></script>
<h3>Log</h3>
<textarea id="log"></textarea>
<!-- Just a simple log function... -->
<script>
function log(txt) {document.getElementById('log').value+=txt+"\n";}
</script>
CSS
textarea#log
{
width: 100%;
height: 1000px;
}
JavaScript
//
// Define database
//
function openDb() {
return idb.openDB('test-idb', 1, {
upgrade(db) {
console.log('Creating store');
const store = db.createObjectStore('tablea', { keyPath: 'id' });
store.createIndex('position', 'position');
db.createObjectStore('tableb', { keyPath: 'id' });
},
});
}
//
// Prepare some data
//
var drops = [];
for (var i=1;i<=10000;++i) {
drops.push({
id: i,
position: Math.random(),
someData: {
someText: "some value",
someNumber: Math.random()
}
});
}
//
// Test Performance
//
testPerformance().catch(err => log(err));
async function testPerformance() {
try {
let db = await openDb();
log(``);
log(`idb put() (with transaction but no waiting)`);
log(`=========`);
log(`Let's put() 10,000 documents in a single transaction and not waiting! ...`);
time = performance.now();
{
let tx = db.transaction('tablea', 'readwrite');
for (const drop of drops) {
tx.store.put(drop);
}
await tx.done;
tx = db.transaction('tableb', 'readwrite');
tx.store.put({ id: 1, version: '0.1' });
await tx.done;
}
log(`put() operations done. Took ${Math.round(performance.now() - time)} milliseconds.`);
db.close();
db = await openDb();
// Put something in tablea but don't wait
{
const tx = db.transaction(['tablea', 'tableb'], 'readwrite');
const tablea = tx.objectStore('tablea');
tablea.put({
id: 9999,
position: Math.random(),
someData: {
someText: "some value",
someNumber: Math.random()
}
});
const tableb = tx.objectStore('tableb');
await tableb.put({ id: 1, version: '0.2' });
await tx.done;
}
log('Successfully did stuff');
await idb.deleteDB('test-idb');
} catch (err) {
log (err);
}
}