您的位置:

Mongo事务

一、概述

MongoDB是一种非关系型数据库,特点是高度可扩展、灵活、高性能、开源等。在MongoDB 4.0版本中,加入了事务(Transaction)功能,使得MongoDB可以支持像传统关系型数据库一样工作。

事务是指一组原子操作,它们可以被视为一个整体,要么全部成功,要么全部失败。MongoDB的事务是在一个集合内进行的,不支持跨多个集合或多个分片的事务。

二、事务的支持范围

在MongoDB 4.0版本中,事务仅支持副本集和单节点,不支持分片集群。

三、事务的API

启动一个事务的API是client.startSession(),该方法返回一个Session对象,每个Session对象都有自己的事务ID。

在Session对象内进行操作时,需要使用该Session对象。如果未指定Session对象,则不在事务中执行。

提交事务和回滚事务的API分别是session.commitTransaction()和session.abortTransaction()。

四、事务的例子

from pymongo import MongoClient

client = MongoClient()
db = client['test']

with client.start_session() as session:
    with session.start_transaction():
        db.users.update_one({'name': 'Tom'}, {'$set': {'age': 25}})
        db.orders.delete_one({'status': 'invalid'})
    session.commit_transaction()

在这个例子中,我们使用with语句创建一个Session对象并启动了一个事务。在事务中,我们更新了db.users集合中的一个文档,并删除了db.orders集合中状态为'invalid'的文档。在事务完成后,我们使用session.commit_transaction()将事务提交。

五、事务的隔离级别

事务的隔离级别指多个事务之间的可见性。在MongoDB中,事务的隔离级别有四种:

  • Read uncommitted: 读取未提交数据
  • Read committed: 读取已提交数据
  • Repeatable read: 可重复读
  • Serializable: 可串行化

用户可以使用以下语句设置隔离级别:

session.start_transaction(read_concern=ReadConcern('local'),
                          write_concern=WriteConcern(w='majority'),
                          read_preference=ReadPreference.PRIMARY)

其中read_concern指定了读取事务的隔离级别,write_concern指定了写入事务的隔离级别,read_preference指定了读取数据的偏好。

六、事务的回滚和超时

事务可以通过session.abortTransaction()方法进行回滚。如果事务运行时间过长或过程中发生错误,可以使用session.abortTransaction()方法回滚事务。

事务默认情况下有60秒的超时时间,可以通过session.expire_after_seconds()方法重新设置超时时间。如果事务在超时前未能提交,将自动回滚。

七、结论

MongoDB 4.0版本中加入了事务功能,使得MongoDB可以支持事务,成为了一种更加全面的数据库。在使用事务时,需要注意事务的支持范围、API、隔离级别、回滚和超时等重要方面。