4.0已经支持多文档事务
当事务提交时,事务中所做的所有数据更改都将保存并在事务外部可见。
在事务提交之前,事务中的数据更改在事务外部不可见。
当事务中止时,事务中所做的所有数据更改都将被丢弃而不会变得可见。
例如,如果事务中的任何操作失败,则事务将中止,并且事务中所做的所有数据更改都将被丢弃而不会变得可见。
存储引擎
多文档事务仅适用于使用WiredTiger存储引擎的部署
多文档事务不适用于使用内存存储引擎或弃用的MMAPv1存储引擎的部署。
事务和操作
你可以在现有集合上指定读/写(CRUD)操作.集合可以位于不同的数据库中。
你无法读取/写入config,admin或者local数据库中的集合。
你不能写入system.* 集合
你无法返回支持的操作的查询计划(如explain)
对于在事务之外创建的游标,你无法在事务中调用getMore
对于在事务中创建的游标,您不能在事务外调用getMore
限制
影响数据库目录的操作,例如创建或删除集合或索引。
例如,多文档事务不能包含将导致创建新集合的插入操作。
listCollections和listIndexes命令及其辅助方法也被排除在外。
非CRUD和非信息操作,例如createUser,getParameter,count等,以及它们的帮助程序。
mongoshell
Session.startTransaction()
Session.commitTransaction()
Session.abortTransaction()
事务和重试
无论retryWrites是否设置为true,事务内的各个写入操作都不可重试
如果操作失败会获得error,错误中包裹 errorLabels,如果errorLabels是TransientTransactionError,那就可以重试整个事务
提交操作是可重试的写操作,如果errorLabels是UnknownTransactionCommitResult,那就重试提交操作
read concern 和write concern
local
具有read concern local的查询从实例返回数据,而不保证数据已被写入大多数副本集成员(如回滚)。
majority
对于与多文档事务无关的读取操作,read concern majority 保证数据读取已被大多数副本集成员确认(如 读取的文档是持久的并且保证不回滚)。
但是,对于多文档事务中的操作,只有当事务以write concern majority 提交时,read concern majority 才提供其保证。否则,read concern majority 不能保证事务中读取的数据。
snapshot
read concern snapshot仅适用于多文档事务。
如果事务不是因果一致会话的一部分,则在write concern majority的事务提交时,事务操作保证从多数提交数据的快照读取
如果事务是因果一致会话的一部分,则在write concern majority的事务提交时,事务操作保证从多数提交数据的快照读取,该快照提供与事务开始之前的操作的因果一致性。
你可以在事务开始前指定concern
如果在事务开始时未指定,则事务使用会话级读取问题,或者,如果未设置,则使用客户端级读取问题。