一、概述
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、隔离级别、回滚和超时等重要方面。