云开发数据库事务能力初探|云开发新能力
▌作者
▌前言
小程序·云开发数据库事务能力上线啦!这是我很期待的一个能力,毕竟有了事务能力的数据库,才能称为完整的数据库。
▌什么是事务
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
▌事务的特性
ACID,指数据库事务正确执行的四个基本要素的缩写。
一个支持事务的数据库,必需要具有这四种特性,否则在事务过程当中无法保证数据的正确性。
1:原子性(Atomicity)
指的是一个事务内所有操作共同组成一个原子包,要么全部成功,要么全部失败。
2:一致性(Consistency)
指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。
即事务前后,数据库的状态都满足所有的完整性约束。
3:隔离性(Isolation)
指的是数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
4:持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
▌事务的作用
这里我们简单的例子来说明。
A、B各有50元,A要向B支付20元
在这个例子里,首先支付之前我们会查询数据库里A的账户余额是否满足支付条件,再执行账户之间的扣除/增加。
在没有事务机制下,这些操作往往是分开的,即从A账户扣除20元,再给B账户加上20元。这在高并发的情况下,极易出现一些错误。比如A账户没有扣除,但是B账户上加了 20元;又或者A账户扣除了20元,但并没有给B账户加上20元的操作,就会造成A账户剩余30元,B账号不变的情况。如下图
有了事务机制后,当我们看到转账事务的中间环节出现问题时,通过数据库事务能力,我们可以实现回滚至最初状态。
▌Quick Start:云开发·云数据库事务
云开发事务提供两种操作风格的接口,一个是简易的、带有冲突自动重试的runTransaction接口,一个是流程自定义控制的startTransaction接口。
通过runTransaction回调中获得的参数transaction或通过startTransaction获得的返回值transaction,我们将其类比为 db 对象,只是在其上进行的操作将在事务内的快照完成,保证原子性。transaction 上提供的接口树形图一览:
runTransaction
startTransaction
▌总结
云开发事务能力,可以通过小程序端调用云函数,也可以直接通过云函数调用云;此外,在事务能力上云开发已经基于session进行了封装,只需要考虑事务期间该设立什么条件,也提供2种事务的API,这在使用上更加灵活方便。
云开发数据库专题视频:
https://www.bilibili.com/video/av76253080
更具体的数据库事务文档:
https://developers.weixin.qq.com/minigame/dev/wxcloud/guide/database/transaction.html 或者点击文末阅读原文跳转。
更多精彩
点击在看让更多人发现精彩