懂
  • 发布:2022-07-04 17:29
  • 更新:2023-07-24 00:28
  • 阅读:530

关于jql如何开启事务

分类:uniCloud

接触云开发不久,想蹭蹭免费的阿里云服务器,某些新增编辑业务想使用开启事务,但最后实现不出来发现,好像事务只能用于云函数,但是又不打算使用云函数(阿里云函数有限制),也懒得搞单路由云函数,所以想用jql来实现


无意中发现action好像可以实现,结果试了一下发现只能回滚当前加了action这条的操作。
需求:用户有多个收货地址,但是默认地址只能有一个;

// 用户设置默认收货地址  
db.action('test').collection('user-address').doc(e._id).update({is_default: true })

action-test如下


结果发现,直接进行rollback操作了,上图设置旧默认地址的操作一直没法正常回滚。
所以实在不明白action中的事务操作有什么作用,难道jql是真的开不了事务吗

----------- 补充 -------------

经过测试发现了问题所在,开启了事务之后,得使用transaction来替代db才能将该次请求加入到事务中

const db = uniCloud.database()  
state.transaction = await db.startTransaction()  
// 该次操作加入事务中,由事务管理  
state.transaction.collection('user-address').doc(defaultAddr.data[0]._id).update({is_default: false})  
// 该次操作不加入事务  
db.collection('user-address').doc(defaultAddr.data[0]._id).update({is_default: false})

最终测试,action和云函数中是可以加入事务的,但是jql中是无法开启的,原因可能如下

// 云函数中使用db有两种创建方式  
const db = uniCloud.database()    // 不支持jql语法  
const dbJql = uniCloud.databaseForJQL()    // 支持jql语法  
// clientDB中使用db  
const db = uniCloud.database()    // 支持jql语法

可能因为在clientDB中创建的 db 默认就是 JQL 吧,调用transaction.collection会提示没有collection方法,就像在云函数中使用dbJql去创建transaction一样。所以想分开封装请求而不经过云函数,可能目前还不行。

0 关注 分享

要回复文章请先登录注册

Javin

Javin

回复 DCloud_uniCloud_WYQ :
const transaction = await dbJQL.startTransaction()
这么重要的功能为什么不先支持?多久了
2023-07-24 00:28
w***@163.com

w***@163.com

回复 DCloud_uniCloud_WYQ :
const dbJQL = uniCloud.databaseForJQL({
clientInfo: this.getClientInfo()
})
const transaction = await dbJQL.startTransaction()
await transaction.collection('biz-order').doc(value._id).update(orderDoc)
-------------
我执行上面的代码时,报出下面的错误:
“startTransaction().collection().doc().update()命令不正确,请检查方法名及调用顺序” 。
这是因为uniCloud.databaseForJQL()不支持startTransaction()方法的原因吗?
2023-04-06 09:40
w***@163.com

w***@163.com

回复 DCloud_uniCloud_WYQ :
uniCloud.databaseForJQL().startTransaction()方法,打算什么时候开始支持?
2023-04-06 09:36
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

暂不支持
2022-11-29 18:31
LKY

LKY

现在JQL也不支持事务吗
2022-11-27 11:36