PyMongo 事务:如何确保 MongoDB 中的数据完整性

2023-04-15 00:00:00 事务 确保 完整性

在 MongoDB 4.0 版本之后,PyMongo 提供了对事务的支持。事务是指一组操作,这些操作作为一个整体要么全部成功要么全部失败。在 MongoDB 中,事务可以用于确保数据的完整性和一致性。

下面是如何在 PyMongo 中使用事务的示例代码:

from pymongo import MongoClient
from bson import ObjectId

client = MongoClient()

db = client.pidancode_com

def transfer_money(from_account, to_account, amount):
    with client.start_session() as session:
        try:
            session.start_transaction()

            # 扣除 from_account 的余额
            db.accounts.update_one({'_id': ObjectId(from_account), 'balance': {'$gte': amount}},
                                   {'$inc': {'balance': -amount}})

            # 给 to_account 增加余额
            db.accounts.update_one({'_id': ObjectId(to_account)},
                                   {'$inc': {'balance': amount}})

            session.commit_transaction()

            return True
        except:
            session.abort_transaction()
            return False

以上代码演示了如何在 PyMongo 中使用事务来转账。transfer_money 函数接受三个参数:转出账户、转入账户和转账金额。函数首先使用 with 语句创建一个 MongoDB 事务会话。然后,在 try 块中执行从一个账户中扣减余额和给另一个账户增加余额的两个操作。如果两个操作都执行成功,会话就会提交事务并返回 True。否则,会话会回滚事务并返回 False。

事务会话由 client.start_session() 创建。在 with 语句内的所有 MongoDB 操作都将在同一个事务中执行。如果发生异常,事务将自动回滚,因此我们不需要手动撤销操作。

需要注意的是,为了在 PyMongo 中使用事务,我们需要确保 MongoDB 实例的副本集是启用了复制功能的。此外,在 PyMongo 3.7 版本及之前,事务会话只能在 MongoDB 中执行读写操作。从 PyMongo 3.8 版本开始,事务会话支持 MongoDB 中的非事务性读操作,例如 find()。

相关文章