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);
  }
}