Dexie.js 具有相同范围和模式的事务是否并行 运行?
Does Dexie.js transaction with same scope and mode run in parallel?
我正在做这样的事情,db是Dexie table实例
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
两个顶级事务回调将 运行 并行,直到第一个操作发生 - 这就是本机 IDB 事务处理的用武之地。本机事务在第一次请求之前不会阻止操作.如果您在事务中有三个操作,您会在实践中看到它不会 运行 并行,因为本机事务处理程序将阻止在同一对象存储上的两个读写事务上发生这种情况。
这是每一步中发生的事情:
交易块 1 计划到 运行。
交易块 2 计划到 运行。
事务回调 1 开始。
控制台输出:[txn1] 已启动
控制台输出:[txn1] 从数据库读取
事务回调 1 执行 await read()
。此时native事务为read/write.
锁了三张表
事务回调 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 已提交。
我正在做这样的事情,db是Dexie table实例
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
两个顶级事务回调将 运行 并行,直到第一个操作发生 - 这就是本机 IDB 事务处理的用武之地。本机事务在第一次请求之前不会阻止操作.如果您在事务中有三个操作,您会在实践中看到它不会 运行 并行,因为本机事务处理程序将阻止在同一对象存储上的两个读写事务上发生这种情况。
这是每一步中发生的事情:
交易块 1 计划到 运行。
交易块 2 计划到 运行。
事务回调 1 开始。
控制台输出:[txn1] 已启动
控制台输出:[txn1] 从数据库读取
事务回调 1 执行
锁了三张表await read()
。此时native事务为read/write.事务回调 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 已提交。