transaction-scheduling-within-database.any.js (1992B)
1 // META: script=resources/support.js 2 'use strict'; 3 4 indexeddb_test( 5 (t, db) => { 6 const store = db.createObjectStore('store'); 7 store.put('value', 'key'); 8 }, 9 10 (t, db) => { 11 let transaction1GetSuccess = false; 12 let transaction2GetSuccess = false; 13 14 const onTransactionComplete = barrier_func(2, t.step_func_done(() => { 15 assert_true(transaction1GetSuccess, 16 'transaction1 should have executed at least one request'); 17 assert_true(transaction2GetSuccess, 18 'transaction1 should have executed at least one request'); 19 })); 20 21 const transaction1 = db.transaction('store', 'readonly'); 22 transaction1.onabort = t.unreached_func('transaction1 should not abort'); 23 transaction1.oncomplete = t.step_func(onTransactionComplete); 24 25 const transaction2 = db.transaction('store', 'readonly'); 26 transaction2.onabort = t.unreached_func('transaction2 should not abort'); 27 transaction2.oncomplete = t.step_func(onTransactionComplete); 28 29 // Keep both transactions alive until each has reported at least one 30 // successful operation 31 32 function doTransaction1Get() { 33 const request = transaction1.objectStore('store').get('key'); 34 request.onerror = t.unreached_func('request should not fail'); 35 request.onsuccess = t.step_func(() => { 36 transaction1GetSuccess = true; 37 if (!transaction2GetSuccess) 38 doTransaction1Get(); 39 }); 40 } 41 42 function doTransaction2Get() { 43 // NOTE: No logging since execution order is not deterministic. 44 const request = transaction2.objectStore('store').get('key'); 45 request.onerror = t.unreached_func('request should not fail'); 46 request.onsuccess = t.step_func(() => { 47 transaction2GetSuccess = true; 48 if (!transaction1GetSuccess) 49 doTransaction2Get(); 50 }); 51 } 52 53 doTransaction1Get(); 54 doTransaction2Get(); 55 }, 56 'Check that read-only transactions within a database can run in parallel.');