2***@qq.com
2***@qq.com
  • 发布:2026-02-05 14:10
  • 更新:2026-02-05 16:08
  • 阅读:15

使用事务进行Add多条数据,提示Error: invalid transactionId

分类:uniCloud
for(let i = 0; i < addexprecords.length ;i ++ ){  
    console.log("===addexprecords==dddd==", i , addexprecords[i]);  
    let res_addexprecord = await transaction.collection("lmdata").add(addexprecords[i]);  
   console.log("===res_addexprecord====" , res_addexprecord);  
}

我使用事务添往数据库add,东西,为什么老卡死在这里,有时间这个循环能跑到i=3,有时能跑到i=5,(共有七个数组)
提示 Error: invalid transactionId

如果不进行这个新增操作,整个程序是可以通过的。我用的是阿里云。 这个东西如何搞?

2026-02-05 14:10 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uniCloud 官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

invalid transactionId 是阿里云事务的典型报错,根本原因是:
阿里云事务里一次只能 add 一条记录,不能传数组,也不能在循环里快速连续 add
官方文档已明确说明:

阿里云不支持 runTransaction,请使用 startTransaction;且在事务里 add 一次只能新增单条,不支持批量 link

因此你现在的写法:

for (let i = 0; i < addexprecords.length; i++) {  
  await transaction.collection('lmdata').add(addexprecords[i])  
}

在阿里云事务里会随机出现 invalid transactionId,因为底层把每条 add 都当成一次网络请求,事务 id 很快失效。

解决办法(任选其一):

  1. 把多条记录一次性 add(非事务)
    如果业务不要求事务,直接普通 add 即可,支持数组一次性插入:

    await db.collection('lmdata').add(addexprecords)   // addexprecords 是数组  
  2. 仍用事务,但一条条 add 并控制并发
    必须改成 startTransaction,且每 add 完一条就 await,不要并发:

    const db = uniCloud.database()  
    const transaction = await db.startTransaction()  
    try {  
     for (const doc of addexprecords) {  
       await transaction.collection('lmdata').add(doc)  
     }  
     await transaction.commit()  
    } catch (e) {  
     await transaction.rollback()  
     throw e  
    }  
  3. 把多条数据合并成一条文档再插入
    如果业务允许,把 7 条小记录合并成一条包含数组字段的大记录,一次 add 即可。

总结:
阿里云事务限制“单条 add”,要么放弃事务用批量 add,要么用 startTransaction 并逐条串行插入,否则就会报 invalid transactionId

内容为 AI 生成,仅供参考
2***@qq.com

2***@qq.com (作者)

谢谢解答

要回复问题请先登录注册