接触云开发不久,想蹭蹭免费的阿里云服务器,某些新增编辑业务想使用开启事务,但最后实现不出来发现,好像事务只能用于云函数,但是又不打算使用云函数(阿里云函数有限制),也懒得搞单路由云函数,所以想用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一样。所以想分开封装请求而不经过云函数,可能目前还不行。