uni-app 阿里云非JQL数据库操作使用事务报错
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
阿里云的事务不能用,只要不使用事务,上面这段代码没有问题。
应该加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();