uni-app 阿里云非JQL数据库操作使用事务报错

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app 阿里云非JQL数据库操作使用事务报错

示例代码:

const db = uniCloud.database();  
const _trans = await db.startTransaction();  
await _trans.collection('Base_Subway').remove();  
await _trans.collection('Base_Subway').add(_lineDatas);  
await _trans.commit();

操作步骤:

const db = uniCloud.database();  
const _trans = await db.startTransaction();  
await _trans.collection('Base_Subway').remove();  
await _trans.collection('Base_Subway').add(_lineDatas);  
await _trans.commit();

预期结果:

能用事务对多次数据修改操作进行同步管理

实际结果:

只要使用事务,代码报错



## bug描述:

```javascript
const db = uniCloud.database();  
const _trans = await db.startTransaction();  
await _trans.collection('Base_Subway').remove();  
await _trans.collection('Base_Subway').add(_lineDatas);  
await _trans.commit();

运行上面的代码,报错如下:

TypeError: (intermediate value).deleteMany is not a function
阿里云的事务不能用,只要不使用事务,上面这段代码没有问题。

10 回复

应该加where的吧,试试await _trans.collection(‘Base_Subway’).where({}).remove();


你们自己写几行代码测试下就知道了啊!

我的目的是清空这个表后重新填充新内容。如果将上面代码改成下面这样是可以的。 const db = uniCloud.database(); await db.collection(‘Base_Subway’).remove(); await db.collection(‘Base_Subway’).add(_lineDatas);

另外,我发现不止这一个地方有这个问题,同样的代码在支付宝云上用事务没有问题,但是转到阿里云上就报上面的错误。只要我将调用事务的代码关闭就可以用了。 所以这个并不是我写的代码问题,可以肯定是阿里云上不能使用事务。

好像阿里云的事务不支持一次多条操作

我也碰到这个问题。 经我的测试,发现了它们的区别,如下: 1)阿里云的事务不支持一次删除多行的操作,会报:TypeError: (intermediate value).deleteMany is not a function 2)支付宝云的事务支持一次删除多行的操作 上述1)、2)使用的是相同的代码,如下: const db = await uniCloud.database()
const transaction = await db.startTransaction()

try {
// 注意:支付宝云支持在事务里一次删除多行
const res = await transaction.collection(‘biz-plan-template’)
.where({
‘_id’: db.command.in(idList)
})
.remove()
console.log(’~~~~~ 删除结果:’, res);

await transaction.commit()  
console.log('事务已提交!')  

return {  
  errCode: 0,  
  errMsg: '已删除' + idList.length + '条记录'  
}  

} catch (e) {
await transaction.rollback()
console.error(事务异常!, e)
throw e
}

另外,上述代码,如果用阿里云,改为一行一行删除,则当删除超过1000条记录时,会报事务超时。

阿里云的事务只能开10秒。

阿里云代码如下: // 注意:阿里云只能逐行的删除 for(let docId of idList){ await transaction.collection(‘biz-plan-template’).doc(docId).remove() } console.log(’~ 已删除’ + idList.length + ‘条记录’);

在使用 Uni-App 进行阿里云数据库操作时,如果你使用的是非 JQL(JavaScript Query Language)方式操作数据库,并且涉及到事务处理,可能会遇到一些报错。以下是一些常见的问题和解决方案:

1. 事务处理的基本流程

在阿里云数据库中,事务处理通常包括以下几个步骤:

  • 开启事务
  • 执行一系列数据库操作
  • 提交事务或回滚事务

2. 常见报错及解决方案

报错:Transaction is not active

  • 原因:事务未正确开启或已经结束。
  • 解决方案:确保在调用事务相关操作之前,已经成功开启了事务。例如:
    const transaction = await db.startTransaction();

报错:Transaction has already been committed or rolled back

  • 原因:事务已经提交或回滚,无法再次进行操作。
  • 解决方案:确保在事务提交或回滚后,不再进行任何数据库操作。例如:
    await transaction.commit(); // 或 await transaction.rollback();

报错:Database operation failed

  • 原因:在事务中执行的某个数据库操作失败。
  • 解决方案:确保每个数据库操作都成功执行,如果某个操作失败,及时回滚事务。例如:
    try {
      await transaction.collection('yourCollection').add({ data });
      await transaction.commit();
    } catch (error) {
      await transaction.rollback();
      console.error('Transaction failed:', error);
    }

报错:Transaction timeout

  • 原因:事务执行时间过长,导致超时。
  • 解决方案:优化事务中的操作,减少事务执行时间,或者增加事务超时时间(如果数据库支持)。

3. 示例代码

以下是一个使用事务的完整示例:

const db = uniCloud.database();

async function runTransaction() {
  const transaction = await db.startTransaction();

  try {
    // 在事务中添加数据
    await transaction.collection('yourCollection').add({
      data: { name: 'Alice', age: 25 }
    });

    // 在事务中更新数据
    await transaction.collection('yourCollection').doc('docId').update({
      data: { age: 26 }
    });

    // 提交事务
    await transaction.commit();
    console.log('Transaction committed successfully.');
  } catch (error) {
    // 回滚事务
    await transaction.rollback();
    console.error('Transaction failed, rolled back:', error);
  }
}

runTransaction();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!