PyMongo 事务回滚
在许多程序中,我们需要因程序中间报错或终止,需要回滚已经完成的增加、删除、修改等操作。MongoDB在单主机的情况下,是无法进行回滚操作的。因此,需要先搭建MongoDB副本集。可以点击此处查看Docker 搭建MongoDB Replication(副本集)。
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事务防止因异常数据或程序报错导致数据与执行结果不一致,从而保证程序的一致性。