Выполняет ли индексированная база данных параллельную обработку?

#indexeddb

#indexeddb

Вопрос:

В моем индексированном коде базы данных в IE11 и Chrome у меня есть подобная функция для управления кэшем. Но что я делаю, так это выдаю кучу команд удаления для ключей с истекшим сроком действия (может быть несколько) в кэше, а затем я выдаю команды чтения для чтения содержимого (также может быть несколько) из кэша. Удаление и чтение являются асинхронными. Команды выдаются синхронно одна за другой, например, delete, delete, delete, …, затем read, read, read, … Я ничего не связываю в обратных вызовах чего бы то ни было.

Чего я хочу, так это того, что, если я удалю вызываемый ключ A , а затем прочитаю вызываемый ключ A (это не в обратном вызове команды удаления, просто синхронно после), значение, которое я прочитал, всегда должно быть нулевым или неопределенным.

Возможно ли, что команда read могла что-то прочитать до того, как команда delete будет выполнена для того же ключа из-за природы асинхронного программирования? Или они используют какую-то систему единой очереди обработки, где все задачи выполняются по 1 за раз, так что это гарантирует, что удаления произойдут до любого чтения?

     function deleteExpiredItems(callback) {
        console.info("Clearing expired items now.");

        dbEnumerator(function(key, value, expired) {
            if (expired) {
                console.warn("Key "   key   " expired and is being deleted because it expired.");
                remove(key);
            }
        }, callback);
    }

    function dbEnumerator(itemProcessor, callback) {
        if (db) {
            var transaction = db.transaction([store_NAME], IDBTransaction_READ_ONLY); 
            var objectStore = transaction.objectStore(store_NAME);
            var cursorRequest = objectStore.openCursor();

            cursorRequest.onsuccess = function (event) {
                if (event.target.result) {
                    var val = event.target.result.value.value;
                    var key = event.target.result.value.id;
                    var expired = isCacheExpired(val[1], val[2]);
                    itemProcessor(key, val, expired);
                    event.target.result['continue']();
                }
            };

            transaction.oncomplete = function (event) {
                callback(event);
            };
        } else {
            console.warn("Cannot enumerate on database when it is not set.");
        }
    }
  

Ответ №1:

В рамках транзакции запросы всегда обрабатываются в том порядке, в котором они были сделаны.

 var tx = db.transaction('my_store', 'readwrite');
var store = tx.objectStore('my_store');

var r1 = store.delete(key);
r1.onsuccess = e => console.log('deleted');

var r2 = store.get(key);
r2.onsuccess = e => console.log('got: '   r2.result);
  

Запрос на удаление был сделан первым и будет выполнен первым. Таким образом, запрос get всегда будет приводить к undefined.

Комментарии:

1. как насчет нескольких транзакций? они расположены в последовательном порядке или параллельно?

2. Транзакции могут начинаться, когда они могут получить общий доступ (только для чтения) или эксклюзивный доступ (чтение / запись) к набору хранилищ объектов, к которым им нужен доступ (их область видимости).