y***@126.com
y***@126.com
  • 发布:2023-12-31 14:55
  • 更新:2024-10-12 17:37
  • 阅读:311

【报Bug】阿里云非JQL数据库操作使用事务报错

分类:uniCloud

产品分类: uniCloud/App

示例代码:
    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描述:

    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
阿里云的事务不能用,只要不使用事务,上面这段代码没有问题。

2023-12-31 14:55 负责人:无 分享
已邀请:
cbj44125

cbj44125

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

  • y***@126.com (作者)

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

    2024-01-03 17:48

y***@126.com

y***@126.com (作者)

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

y***@126.com

y***@126.com (作者)

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

4***@qq.com

4***@qq.com

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

w***@163.com

w***@163.com

我也碰到这个问题。
经我的测试,发现了它们的区别,如下:
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  
  }
  • w***@163.com

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


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


    阿里云代码如下:

    // 注意:阿里云只能逐行的删除

    for(let docId of idList){

    await transaction.collection('biz-plan-template').doc(docId).remove()

    }

    console.log('~ 已删除' + idList.length + '条记录');

    2024-10-12 17:42

要回复问题请先登录注册