pymongo事务回滚

1,821 阅读2分钟

mongo事务回滚

在许多程序中,我们需要因程序中间报错或终止,需要回滚已经完成的增加、删除、修改等操作。MongoDB在单主机的情况下,是无法进行回滚操作的。因此,需要先搭建MongoDB副本集。可以点击此处查看Docker 搭建MongoDB Replication(副本集)blog.csdn.net/weixin_4285…

连接MongoDB副本集的主节点。

import pymongo

# 连接Mongodb 注意此处连接的应该是MongoDB副本集的主节点
client = pymongo.MongoClient('192.168.1.75', 27017)

# 数据库
database = client['Demo']

# 数据表
collection = database['demo']

事务回滚方式一 因异常数据导致程序报错或终止,回滚数据。

方式一:

# 创建一个事物会话 默认causal_consistency=True 保持因果一致性
session = client.start_session(causal_consistency=True)

# 开启事务会话
session.start_transaction()


try:
    # 正常插入数据
    collection.insert_one({'0': '正常插入数据'}, session=session)
    
    # 异常插入数据
    collection.insert_one({0: '异常插入数据'}, session=session)
    
    # 抛出一个错误
    # raise ValueError('抛出一个错误')
    
except Exception as e:
    
    # 操作异常 中断事务
    session.abort_transaction()
    
    # 输入异常内容
    print(e)
    
else:
    # 操作正常 提交事务
    session.commit_transaction()
finally:
    # 关闭事务会话
    session.end_session()

方式二:

try:

    # 创建一个事物会话 默认causal_consistency=True 保持因果一致性
    with client.start_session(causal_consistency=True) as session:

        # 开启事务会话
        with session.start_transaction():

            # 正常插入数据
            collection.insert_one({'0': '正常插入数据'}, session=session)

            # 异常插入数据
            collection.insert_one({0: '异常插入数据'}, session=session)
            
            # 抛出一个错误
            # raise ValueError('抛出一个错误')
            
except Exception as e:.
    # 输出异常内容
    print(e)

​ 以上两个程序,开始都有一个正常的插入数据,后面都会因为数据异常报错或程序报错导致数据程序停止,事务将会回滚到程序之前的状态,而不会出现程序执行失败,但是却插入了部分数据导致数据错乱。

​ 在程序中对数据进行增加、删除、修改等操作的地方,可以使用MongoDB事务防止因异常数据或程序报错导致数据与执行结果不一致,从而保证程序的一致性。

使用过程中发现insert操作可以回滚,update操作不支持回滚


# 使用过程中发现insert操作可以回滚,update操作不支持回滚
from pymongo import MongoClient


connect_str = 'mongodb://username:paaword@ip:port,ip:port',

db_name = 'db_name'


# 初始化MongoDB
client = MongoClient(connect_str)

client_db = client[db_name]
occupy_col = client_db['user_occupy']
order_col = client_db['user_order']




if __name__ == "__main__":
    # 默认causal_consistency=True 保持因果一致性
    session = client.start_session(causal_consistency=True)
    # 事务开始
    session.start_transaction()

    try:
        res = occupy_col.update_one(
            {"occupy_id": 'occ_3565DbcBE426'},
            {'$set': {'occupy_count': 15}}
        )
        # res = occupy_col.insert_one({'name': 'xiaoming'}, session=session)

        print(f"res = {res}")
        import time
        time.sleep(15)
        print(aaaaa)

        res2 = occupy_col.update_one(
            {"occupy_id": 'occ_fc07569326E8'},
            {'$set': {'occupy_count': 15}}
        )

        print(f"res2 = {res2}")
        # res = order_col.insert_one({'name': 'xiaoming'}, session=session)

    except:
        import traceback
        traceback.print_exc()
        # 操作异常,中断事务
        print(f"操作异常,中断事务")
        session.abort_transaction()
    else:
        print('commit --- ')
        session.commit_transaction()
    finally:
        print('finally ---')
        session.end_session()