前言
在10月19日的技术峰会上,了解到云开发数据库即将上线事务能力,同时我也是蛮期待事务能力的上线,直到最近终于上线了,毕竟有了事务能力的数据库,才能称为完整的数据库。
什么是事务?
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务的特性
ACID,指数据库事务正确执行的四个基本要素的缩写。
一个支持事务的数据库,必需要具有这四种特性,否则在事务过程当中无法保证数据的正确性。
1:原子性(Atomicity)
指的是一个事务内所有操作共同组成一个原子包,要么全部成功,要么全部失败。
2:一致性(Consistency)
指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。
即事务前后,数据库的状态都满足所有的完整性约束。
3:隔离性(Isolation)
指的是数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
4:持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务的作用
这里我们简单的例子来说明。
A、B各有50元,A要向B支付20元
在这个例子里,首先支付之前我们会查询数据库里A的账户余额是否满足支付条件,满足条件后从A账户扣除20元,在给B账户加上20元。
在没有事务机制下,这些操作往往是分开的,在一些高并发的情况下会出现A账户扣除了20元,但并没有给B账户加上20元的操作,就会造成A账户剩余30元,B账号不变的情况,出现上面这种情况,往往是我们不想看到的。
在有了事务机制后,我们可以看到数据库事务在处理转账事务中如果有其中一个环节不满足,于是我们进行了事务的回滚,还原成最开始的状态。
事务的代码
云开发事务提供两种操作风格的接口,一个是简易的、带有冲突自动重试的runTransaction接口,一个是流程自定义控制的startTransaction接口。
通过runTransaction回调中获得的参数transaction或通过startTransaction获得的返回值transaction,我们将其类比为 db 对象,只是在其上进行的操作将在事务内的快照完成,保证原子性。transaction 上提供的接口树形图一览:
runTransaction
startTransaction
总结
云开发事务能力的使用也是通过小程序端调用云函数,也可以支持云函数调用云函数,在事务能力上云开发已经基于session进行了封装,只需要考虑事务期间该设立什么条件,也提供2种事务的API在使用上更加的灵活。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。