在云数据库操作中,对单个Document的操作是原子的,您应该尽量使用嵌入式Document设计来避免跨Document或者跨Collection事务。如果原子操作和嵌入式结构设计无法满足您的需求,您可以使用事务相关API来实现多Document事务。
云数据库事务说明
事务要么完全执行,要么不执行,不会存在部分成功的现象。
在事务提交之前,事务中的数据更新在事务外完全不可见。在提交事务之后,如果事务操作了多条数据,有可能会出现一部分先可见、另一部分后可见的情况,但是会保证最终一致性。如果事务回滚了,事务中的修改在事务外一直都是不可见的。
在事务过程采用的是快照隔离,在快照隔离中:
读操作返回的是对象的快照,而非实际数据。
写操作会改变对象的快照,保证接下来事务内读到的数据是相同的。
写操作会给对象添加事务锁,如果一个对象上有事务锁,其它的事务对该对象的写入会操作失败,非事务对该对象的写入会阻塞,直到事务锁释放。
为避免大量的锁冲突,目前仅支持在事务中对单个Document的读写操作。
支持事务的命令有:
insertOne, findOne, updateOne, deleteOne, replaceOne, findOneAndUpdate,findOneAndReplace,findOneAndDelete
。仅支持在云函数里面使用事务,不支持客户端直接访问云数据库时使用事务。
事务的有效期为10s,若一个事务在有效期内没有提交,则会自动回滚。
事务API
开启事务。
const transaction = await ctx.mpserverless.db.startTransaction();
在事务中操作单行数据。
const findOneResult = await transaction.collection('user').insertOne( {name: 'xxxx', "age": 19}, );
提交事务。
await transaction.commit();
回滚事务。
await transaction.rollback();
文档内容是否对您有帮助?