首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >云开发数据库的事务处理

云开发数据库的事务处理

原创
作者头像
黄希彤
修改于 2022-01-07 08:32:54
修改于 2022-01-07 08:32:54
59600
代码可运行
举报
文章被收录于专栏:黄希彤的专栏黄希彤的专栏
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
    /* 以下代码会触发云开发数据库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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用【库存】看懂云开发数据库事务
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
腾讯云开发TCB
2020/06/03
9550
关于云开发数据库的使用经验和建议
开发者可以使用云开发快速开发小程序、小游戏、公众号网页等,并且原生打通微信开放能力。
腾讯云开发TCB
2021/04/22
8490
关于云开发数据库的使用经验和建议
MongoDB 多文档事务实践篇—教你如何在 Node.js 中应用
MongoDB 在单文档操作中具有原子性,在多文档操作中就不再具有此特性,通常需要借助事务来实现 ACID 特性。
五月君
2020/02/26
2.7K0
Sequelize事务处理回滚失败
在使用Node.js进行服务端开发中我们经常使用Sequelize作为ORM框架,我们对多个数据表进行处理时通常会使用事务处理。在Sequelize事务文档中给了很多方式,主要分为托管和非托管,很多时候我们在回滚时常常发生失败,明明自己以及提交回滚了,但是仍然有数据表被改动了。
用户6256742
2022/09/16
9560
cocos creator 部署微信云开发
把刚刚授权好的用户信息通过微信云函数保存到微信云数据库中。所以这里需要一个数据库和一个云函数。
全栈程序员站长
2022/11/17
3.5K0
cocos creator 部署微信云开发
事务处理
如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么李四的账户没有加上100元,而张三却减去了100元。这肯定是不行的!
星哥玩云
2022/09/14
5450
多数据源事务处理-涉及分布式事务
在作者之前的 十二条后端开发经验分享,纯干货 文章中介绍的 优雅得Springboot + mybatis配置多数据源方式 里有很多小伙伴在评论区留言询问多个数据源同时在一个方法中使用时,事务是否会正常有效,这里作者 理论 + 实践 给大家解答一波,老规矩,附作者github地址:
wayn
2022/12/16
8830
数据库事务处理与资源池
描述:事务只是针对连接连接对象,如果再开一个连接对象,那么那是默认的提交(注意: 事务是会自动提交的)。
全栈工程师修炼指南
2020/10/23
1K0
数据库事务处理与资源池
SqlTransaction 数据库编程事务使用示例
在提交或回滚 SqlTransaction 时,应始终使用 Try/Catch 进行异常处理。如果连接终止或事务已在服务器上回滚,则 Commit 和 Rollback 都会生成 InvalidOperationException。 下面的示例创建一个 SqlConnection 和一个 SqlTransaction。此示例还演示如何使用 BeginTransaction、Commit 和 Rollback 等方法。出现任何错误时事务都会回滚。Try/Catch 错误处理用于处理尝试提交或回滚事务时的所有
菩提树下的杨过
2018/01/24
7420
怎么判断事务有无提交成功 Java
在 Java 应用程序中,事务的正确处理对于数据的完整性和一致性至关重要。判断事务是否成功提交是事务处理中的一个关键环节,它能帮助我们确保数据库操作按照预期进行,并在出现问题时采取适当的措施。本文将深入探讨在 Java 中如何判断事务是否成功提交,并提供相关的代码示例和详细解释。
编程小白狼
2024/12/31
1940
Django数据库--事务及事务回滚
数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作。Django的ORM在事务方面也提供了不少的API。有事务出错的整体回滚操作,也有基于保存点的部分回滚。本文将讨论Django中的这两种机制的运行原理。
py3study
2020/01/19
4.1K0
一文读懂MongoDB事务处理
在MongoDB中,对单个文档的操作是原子的。由于可以在单个文档结构中使用内嵌文档和数组来获得数据之间的关系,而不必跨多个文档和集合进行范式化,所以这种单文档原子性避免了许多实际场景中对多文档事务的需求。
MongoDB中文社区
2021/12/04
2.7K0
利用云开发优化博客小程序(一)——浏览量统计
由于我的博客是基于开源博客框架ghost搭建的,虽然相较于wordpress轻量了很多,但在功能上远没有wordpress丰富,像基本的网站统计,文章统计,点评之类的通通没有。
Bug生活2048
2018/10/18
1.6K0
利用云开发优化博客小程序(一)——浏览量统计
在云函数中使用真正serverless的SQL数据库sqlite
cloud.tencent.com/developer/article/1984526
landv
2023/03/18
1.5K2
在云函数中使用真正serverless的SQL数据库sqlite
之前在云函数里一直调用云开发数据库,虽然延迟有点不稳定也忍了。最近有一个需求连续对数据库进行一系列的操作,云开发数据库的性能抖动一下就被放大了,函数经常性的运行超时,这就不能忍了,因为数据量本来也不算大,动起了用nodejs的嵌入式数据库的歪心思。
黄希彤
2022/04/19
3.4K2
实习第十一周,第十二周
title属性是必须的,用来指定通知的标题,格式为字符串。options属性是可选的,格式为一个对象,用来设定各种设置
治电小白菜
2020/08/25
7180
实习第十一周,第十二周
前端微信小程序云开发基础讲解
云开发是微信团队联合腾讯云提供的原生serverless云服务,致力于帮助更多的开发者快速实现小程序业务的开发,快速迭代。
达达前端
2022/04/29
7020
前端微信小程序云开发基础讲解
MySQL中不得不提的事务处理
记得前些日子分享过一篇有关MySQL中事务的知识点,但当时对MySQL中的事务只是纯粹的知道如何使用,缺乏对理论的进一步认识,抽时间单独去了解了一下,便在做一个较为全面的总结.
兔云小新LM
2019/08/14
6200
MySQL中不得不提的事务处理
Hibernate常用API
文章目录 1. Hibernate常用API 1.1. 增删改查的是实例(Session) 1.1.1. 创建一个工具类 1.1.2. 增删改查 Hibernate常用API Configuration :负责加载核心配置文件 加载的默认名字为hibernate.cfg.xml,如果不是这个名字,那么需要指定 SessionFactory configuration.buildSessionFactory() 创建SessionFactory SessionFactory : 用来创建Sessio
爱撒谎的男孩
2019/12/31
3190
腾讯云新产品“云开发”尝鲜体验
最近用云开发写仿了一个很古老的小游戏 http://stonelf.gitee.io/letter/letter.html 大家可以点进去玩一下。分享一下过程中踩的一些坑。
黄希彤
2019/11/27
10.9K1
腾讯云新产品“云开发”尝鲜体验
相关推荐
用【库存】看懂云开发数据库事务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验