MongoDB中如何实现事务?

MongoDB索引用于优化查询和排序操作,保证查询效率。索引存储在集合中,以一定的排序存储集合中的一些字段,使用这些字段的值快速查找和排序集合中的文档。

在MongoDB中,使用db.collection.createIndex()命令创建索引。语法如下:

db.collection.createIndex(keys, options)
- keys: 要创建索引的字段。1表示升序创建索引,-1表示降序。
- options: 可选参数,控制索引的创建选项,比如名字、唯一性约束等。

例如:

# 升序创建name字段索引
db.users.createIndex({name: 1})

# 联合索引,先按age升序,再按name降序
db.users.createIndex({age: 1, name: -1})

# 创建唯一索引
db.users.createIndex({email: 1}, {unique: true})

在MongoDB 4.2版本以前,只支持单文档事务,使用两个阶段提交(two-phase commit,2PC)实现。
从MongoDB 4.2开始,WiredTiger存储引擎支持多文档事务和two-phase commit(2PC)。

语法如下:
开始事务:

session.startTransaction()

提交事务:

session.commitTransaction()

回滚事务:

session.abortTransaction()

示例:

const session = db.getMongo().startSession()

session.startTransaction()

db.users.updateOne({name: "John"}, {$inc: {age: 1}}, {session})
db.logs.insertOne({name: "transaction_log"}, {session})

if (canCommit) {
  session.commitTransaction()
} else {
  session.abortTransaction()  
}