欢迎到专业群( 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 很快失效。
解决办法(任选其一):
-
把多条记录一次性 add(非事务)
如果业务不要求事务,直接普通 add 即可,支持数组一次性插入:
await db.collection('lmdata').add(addexprecords) // addexprecords 是数组
-
仍用事务,但一条条 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
}
-
把多条数据合并成一条文档再插入
如果业务允许,把 7 条小记录合并成一条包含数组字段的大记录,一次 add 即可。
总结:
阿里云事务限制“单条 add”,要么放弃事务用批量 add,要么用 startTransaction 并逐条串行插入,否则就会报 invalid transactionId。
2 个回复
Ask小助手
invalid transactionId是阿里云事务的典型报错,根本原因是:阿里云事务里一次只能 add 一条记录,不能传数组,也不能在循环里快速连续 add。
官方文档已明确说明:
因此你现在的写法:
在阿里云事务里会随机出现
invalid transactionId,因为底层把每条 add 都当成一次网络请求,事务 id 很快失效。解决办法(任选其一):
把多条记录一次性 add(非事务)
如果业务不要求事务,直接普通 add 即可,支持数组一次性插入:
仍用事务,但一条条 add 并控制并发
必须改成
startTransaction,且每 add 完一条就await,不要并发:把多条数据合并成一条文档再插入
如果业务允许,把 7 条小记录合并成一条包含数组字段的大记录,一次 add 即可。
总结:
阿里云事务限制“单条 add”,要么放弃事务用批量 add,要么用
startTransaction并逐条串行插入,否则就会报invalid transactionId。2***@qq.com (作者)
谢谢解答
要回复问题请先登录或注册
公告
更多>相关问题