数据库事务

在云数据库操作中,对单个Document的操作是原子的,您应该尽量使用嵌入式Document设计来避免跨Document或者跨Collection事务。如果原子操作和嵌入式结构设计无法满足您的需求,您可以使用事务相关API来实现多Document事务。

云数据库事务说明

  1. 事务要么完全执行,要么不执行,不会存在部分成功的现象。

  2. 在事务提交之前,事务中的数据更新在事务外完全不可见。在提交事务之后,如果事务操作了多条数据,有可能会出现一部分先可见、另一部分后可见的情况,但是会保证最终一致性。如果事务回滚了,事务中的修改在事务外一直都是不可见的。

  3. 在事务过程采用的是快照隔离,在快照隔离中:

    • 读操作返回的是对象的快照,而非实际数据。

    • 写操作会改变对象的快照,保证接下来事务内读到的数据是相同的。

    • 写操作会给对象添加事务锁,如果一个对象上有事务锁,其它的事务对该对象的写入会操作失败,非事务对该对象的写入会阻塞,直到事务锁释放。

  4. 为避免大量的锁冲突,目前仅支持在事务中对单个Document的读写操作。

    支持事务的命令有:insertOne, findOne, updateOne, deleteOne, replaceOne, findOneAndUpdate,findOneAndReplace,findOneAndDelete

  5. 仅支持在云函数里面使用事务,不支持客户端直接访问云数据库时使用事务。

  6. 事务的有效期为10s,若一个事务在有效期内没有提交,则会自动回滚。

事务API

  1. 开启事务。

        const transaction = await ctx.mpserverless.db.startTransaction();
  2. 在事务中操作单行数据。

        const findOneResult = await transaction.collection('user').insertOne(
            {name: 'xxxx', "age": 19},
        );
  3. 提交事务。

        await transaction.commit();
  4. 回滚事务。

        await transaction.rollback();