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()