前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云开发数据库的事务处理

云开发数据库的事务处理

原创
作者头像
黄希彤
修改2022-01-07 16:32:54
4920
修改2022-01-07 16:32:54
举报
文章被收录于专栏:黄希彤的专栏黄希彤的专栏

云开发数据库文档中其实有一些事务处理的指引和demo,不过基本都是await风格的,只能在异步函数里面使用,有的时候希望用『同步函数+callback』的方式代替await来实现更好的并发执行能力,那就需要用promise的编程风格了,写了个demo:

代码语言:javascript
复制
exports.main_handler =  (event, context , callback) => {
    let collectionName = "test",commitState = false, n = 500;
    db.startTransaction().then(transaction=>{
        transaction.collection(collectionName).add([
            {_id:Math.floor(Math.random()*n),a:1},
            {_id:Math.floor(Math.random()*n),a:2},
        ]).then(res=>{
            return transaction.collection(collectionName).add({_id:Math.floor(Math.random()*n),b:2})
        }).then(res=>{
            return transaction.collection(collectionName).add({_id:Math.floor(Math.random()*n),b:2})
        }).then(res=>{
            commitState=true;
            return transaction.commit()
        }).then(res=>{
            callback(null,{code:0,msg:"事务提交成功: "+JSON.stringify(res)})
        },rej=>{
            if(commitState){
                transaction.rollback().then(res=>{
                    callback(null,"提交失败,回滚成功")
                },rej=>{
                    callback(null,"提交失败,回滚失败")
                })
            }else{
                callback(null,"事务创建失败,尚未提交,无需回滚")
            }
        })
    },()=>{
        console.log("开启事务失败")
        callback(null,"开启事务失败")
    })
};

代码中刻意使用了500内的随机整数来当id来制造随机的id冲突以随机初发事务的失败。

其实如果能用Promise.all的化代码还能更好看些

代码语言:javascript
复制
    /* 以下代码会触发云开发数据库sdk的bug */
    db.startTransaction().then(transaction=>{
        for(var i=0;i<5;i++){
            p.push(transaction.collection(collectionName).add({_id:Math.floor(Math.random()*n),a:3}))
        }
        Promise.all(p).then(res=>{
            transaction.commit().then(res=>{
                callback(null,{code:0,msg:"事务提交成功: "+JSON.stringify(res)})
            },rej=>{
                transaction.rollback().then(
                    res=>{
                    callback(null,"提交失败,回滚成功")
                },rej=>{
                    console.log(rej)
                    callback(null,"提交失败,回滚失败")
                })
            })
        },rej=>{
            console.log(rej)
            callback(null,"事务创建失败,尚未提交,无需回滚")
        })
    },()=>{
        callback(null,"开启事务失败")
    })

但是云开发数据库的sdk不支持这么玩。Promise.all里的数据库操作一多起来,就有一定的概率触发这样的错误:

TcbError: [ResourceUnavailable.TransactionBusy] Transaction is busy.

暂时只能用上面的一步一步then的方式来执行了,或者用网上流行的Array.reduce的方式来让Promise排队执行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云函数
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档