Javin
Javin
  • 发布:2023-07-23 19:36
  • 更新:2023-07-23 19:36
  • 阅读:274

JQL数据库操作文档里说当before开启事物数据库失败的时候在after里进行回滚具体怎么做?

分类:uniCloud

https://uniapp.dcloud.net.cn/uniCloud/jql.html 这个文档里面有下面这段描述

before在数据库操作执行前触发,before里的代码执行完毕后再开始操作数据库。before的常用用途:

对前端传入的数据进行二次处理
在此处开启数据库事务,万一操作数据库失败,可以在after里回滚
使用throw阻止运行
如果权限或字段值域校验不想配在schema和validateFunction里,也可以在这里做校验
after在数据库操作执行后触发,JQL操作数据库后触发after里的代码。after的常用用途:

对将要返回给前端的数据进行二次处理
也可以在此处处理错误,回滚数据库事务
对数据库进行二次操作,比如前端查询一篇文章详情后,在此处对文章的阅读数 1。因为permission里定义,一般是要禁止前端操作文章的阅读数字段的,此时就应该通过action,在云函数里对阅读数 1

然后下面有一段示例代码

// state参数格式如下  
{  
  command: {  
    // getMethod('where') 获取所有的where方法,返回结果为[{$method:'where',$param: [{a:1}]}]  
    getMethod,  
    // getParam({name:'where',index: 0}) 获取第1个where方法的参数,结果为数组形式,例:[{a:1}]  
    getParam,  
    // setParam({name:'where',index: 0, param: [{a:1}]}) 设置第1个where方法的参数,调用之后where方法实际形式为:where({a:1})  
    setParam  
  },  
  auth: {  
    uid, // 用户ID,如果未获取或者获取失败uid值为null  
    role, // 通过uni-id获取的用户角色,需要使用1.1.9以上版本的uni-id,如果未获取或者获取失败role值为[]  
    permission // 通过uni-id获取的用户权限,需要使用1.1.9以上版本的uni-id,如果未获取或者获取失败permission值为[],注意登录时传入needPermission才可以获取permission,请参考 https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=rbac  
  },  
  // 事务对象,如果需要用到事务可以在action的before内使用state.transaction = await db.startTransaction()传入  
  transaction,  
  // 更新或新增的数据  
  newData,  
  // 访问的集合  
  collection,  
  // 操作类型,可能的值'read'、'create'、'update'、'delete'  
  type  
}

我的理解是在before过程中要创建一个事物对象state.transaction = await db.startTransaction()?然后用这个事物对象操作别的库,在after阶段查看当前的库的数据有没有写入成功,如果写入成功调用transaction.commit()让事务结束,如果失败调用transaction.rollback()回滚,但是当前库的写入过程好像并不在这个事务内,假设一些极端的情况,比如数据已经写入了当前库,但是因为断电并没有来得及调用after,这样就导致了操作其他库的事务没有完成,但是当前库里已经有了数据。我这样理解对吗?
还有一个问题uniCloud.databaseForJQL函数好像并没有startTransaction函数没办法开启事务处理。
只有uniCloud.database里有,但是这个函数里面少了权限校验比较难用啊。
我能在云端使用uniCloud.database().startTransaction进行schema权限校验吗?

2023-07-23 19:36 负责人:无 分享
已邀请:

要回复问题请先登录注册