相同范围和模式的 Dexie.js 事务是不是并行运行?

Posted

技术标签:

【中文标题】相同范围和模式的 Dexie.js 事务是不是并行运行?【英文标题】:Does Dexie.js transaction with same scope and mode run in parallel?相同范围和模式的 Dexie.js 事务是否并行运行? 【发布时间】:2021-03-22 15:19:37 【问题描述】:

我在做这样的事情,db是Dexie表实例

    var db = new Dexie("myDB");
    db.transaction("rw", ["table1", "table2", "table3"], async ()=>
      console.log("[txn1] started");
      
      //function which reads something from db
      console.log("[txn1] reading from db");
      await read()
      
      // function which writes something in a nested transaction
      console.log("[txn1] writing to db");
      await write()
      
      console.log("[txn1] finished");
    )

    db.transaction("rw", ["table1", "table2", "table3"], async ()=>
      console.log("[txn2] started");
      
      //function which reads something from db
      console.log("[txn2] reading from db");
      await read()
      
      // function which writes something in a nested transaction
      console.log("[txn2] writing to db");
      await write()
      
      console.log("[txn2] finished");
    )

我期待由于事务处于相同的范围和相同的模式,回调将不会并行执行,即 输出应该是

    [txn1] started
    [txn1] reading from db
    [txn1] writing to db
    [txn1] finished
    [txn2] started
    [txn2] reading from db
    [txn2] writing to db
    [txn2] finished

但是输出却是这样的

    [txn1] started
    [txn1] reading from db
    [txn2] started
    [txn2] reading from db
    [txn1] writing to db
    [txn1] finished
    [txn2] writing to db
    [txn2] finished

【问题讨论】:

【参考方案1】:

两个***事务回调将并行运行,直到第一个操作发生 - 这就是原生 IDB 事务处理的用武之地。原生事务在第一个请求之前不会阻塞操作。如果您在事务中有三个操作,您会在实践中看到它不会并行运行,因为本机事务处理程序将阻止在同一对象存储上的两个读写事务上发生这种情况。

这是每一步都会发生的事情:

    事务块 1 计划运行。

    事务块 2 计划运行。

    事务回调 1 开始。

    控制台输出:[txn1] 开始

    控制台输出:[txn1] 从数据库读取

    事务回调 1 执行 await read()。此时本机事务锁定了三个表进行读/写。

    事务回调 2 开始。

    控制台输出:[txn2] 开始

    控制台输出:[txn2] 从数据库读取

    事务回调 2 执行 await read()。读取操作被阻止。

    事务 1 的 await read() 完成。

    控制台输出:[txn1] 写入数据库

    事务回调 1 执行 await write()

    控制台输出:[txn1] 完成

    事务 1 已提交。

    事务回调 2 的 await read() 现已恢复。

    事务 2 的 await read() 完成。

    控制台输出:[txn2] 写入数据库

    事务回调 2 执行 await write()

    控制台输出:[txn2] 完成

    事务 2 已提交。

【讨论】:

以上是关于相同范围和模式的 Dexie.js 事务是不是并行运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dexie.js 中索引和查询嵌套数组?

Dexie JS - 结合条件过滤器和文本搜索

为啥相同事务的两个并行执行之间会出现死锁?

如何使用 dexie.js 添加新条目

在 JavaScript 文件中添加 Dexie.js 查询会提示缺少类型

缓存 - IndexedDB - Dexie.js