PyMongo 事务回滚


在许多程序中,我们需要因程序中间报错或终止,需要回滚已经完成的增加、删除、修改等操作。MongoDB在单主机的情况下,是无法进行回滚操作的。因此,需要先搭建MongoDB副本集。可以点击此处查看Docker 搭建MongoDB Replication(副本集)。
- 连接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事务防止因异常数据或程序报错导致数据与执行结果不一致,从而保证程序的一致性。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178204.html原文链接:https://javaforall.net
