事务
概述
在本指南中,您可以了解如何使用 MongoDB Go 驱动程序来执行事务。 事务允许您运行一系列操作,这些操作在提交事务之前不会更改任何数据。如果事务中的任何操作返回错误,驱动程序就会取消事务,并在所有数据更改变得可见之前将其丢弃。
在 MongoDB 中,事务在逻辑会话中运行。会话是一组要按顺序运行的相关读取或写入操作。会话可以实现一组操作的因果一致性,或支持在 ACID 事务中执行操作。MongoDB 保证事务操作中涉及的数据保持一致,即使操作遇到意外错误。
使用 Go 驱动程序时,您可以从 Client
实例创建一个新会话,并将其类型定义为 Session
。我们建议您将客户端重复用于多个会话和事务,而不是每次都实例化新客户端。
警告
仅应将 Session
与创建它的 Client
(或关联的 Database
或 Collection
)一起使用。将 Session
与其他 Client
一起使用会导致操作错误。
警告
Session
的实现对于并发使用多个 goroutine 是不安全的。
方法
使用 StartSession()
方法启动会话后,可使用 Session
接口提供的方法集修改会话状态。下表介绍了这些方法:
方法 | 说明 |
---|---|
StartTransaction() | 在此会话上启动使用给定选项配置的新事务。如果会话已存在正在进行的事务,则返回错误。要了解有关此方法的更多信息,请参阅服务器手册中的startTransaction() 页面。 参数: TransactionOptions 返回类型: error |
AbortTransaction() | 终止此会话的活动事务。如果会话中没有活动事务,或事务已提交或结束,则返回错误。要了解有关此方法的更多信息,请参阅服务器手册中的 abortTransaction() 页面。 参数: Context 返回类型: error |
CommitTransaction() | 提交此会话的活动事务。如果此会话没有活动事务或事务已结束,则返回错误。要了解有关此方法的更多信息,请参阅服务器手册中的 commitTransaction() 页面。 注意重试事务
事务可以成功,但会返回带有 参数: Context 返回类型: error |
WithTransaction() | 在此会话上启动事务并运行 fn callback。参数: Context 、fn func(ctx SessionContext) 、TransactionOptions 返回类型: interface{} 、error |
EndSession() | 终止所有现有事务并关闭会话。 参数: Context 返回类型:无 |
Session
接口还提供检索会话属性和修改可变会话属性的方法。有关更多信息,请参阅 API 文档。
例子
以下示例显示如何通过以下步骤创建会话、创建事务以及提交多文档插入操作:
使用
StartSession()
方法从客户端创建会话。使用
WithTransaction()
方法启动事务。插入多个文档。
WithTransaction()
方法执行插入并提交事务。如果任何操作导致错误,WithTransaction()
将处理取消事务。使用
EndSession()
方法关闭 ACID 事务和会话。
wc := writeconcern.Majority() txnOptions := options.Transaction().SetWriteConcern(wc) // Starts a session on the client session, err := client.StartSession() if err != nil { panic(err) } // Defers ending the session after the transaction is committed or ended defer session.EndSession(context.TODO()) // Inserts multiple documents into a collection within a transaction, // then commits or ends the transaction result, err := session.WithTransaction(context.TODO(), func(ctx mongo.SessionContext) (interface{}, error) { result, err := coll.InsertMany(ctx, []interface{}{ bson.D{{"title", "The Bluest Eye"}, {"author", "Toni Morrison"}}, bson.D{{"title", "Sula"}, {"author", "Toni Morrison"}}, bson.D{{"title", "Song of Solomon"}, {"author", "Toni Morrison"}}, }) return result, err }, txnOptions)
如果您需要对事务拥有更多控制,您可以在完整代码示例中找出一个说明如何手动创建、提交和结束事务的示例
更多信息
有关插入操作的更多信息,请参阅插入文档基础知识页面。
有关在 Go 驱动程序中指定写关注的更多信息,请参阅写关注。
有关通过 Go 驱动程序使用会话和事务的其他示例,请参阅有关多文档 ACID 事务的开发者博客文章。
API 文档
要进一步了解本指南所讨论的任何类型或方法,请参阅以下 API 文档: